TLS/SSL 协议详解 (7) SSL 数字证书的一些细节2
证书格式
编码格式
证书编码格式多种,但是不要根据文件后缀名(der,cer)等区分证书格式。
总的来说,证书分为2种,一种是二进制的、一种是进行base64编码的证书。前者使用notepad或者任意文本编辑器打开,显示乱码,后者则显示正常的base64编码后的数据。下图为经过base64编码后的证书,由BEGAIN和END包括。(老司机可能就发现了,有点像长了一点的迅雷下载链接)
至于是否换行完全取决于习惯,但是我的确也碰到过有些解析程序要求一行不能超过特定字符。
所谓二进制证书,也就是原始的asn1格式的证书,如果熟悉asn1编码方式,直接看2进制会看到明显的’30 82 ...’等asn1的类型长度标识,这里不再赘述,但是二进制不适合网络传输,所以普遍采用base64将其编码。
其次还有一种格式叫pfx(PKCS12)格式的证书,与其说是证书,不如叫它证书+私钥的package比较合适,一个文件即包含证书(证书链),也包含私钥。pfx本身可被加密,所以可能需要输入**才能解析pfx。
另一种证书格式称之为p7b,他是多个证书组织成的格式(一般是证书链)。在windows下可以由windows自带程序解析,我们可以提取出其中各个证书。
私钥格式
私钥格式也分为二进制和base64编码,不再赘述。
但是私钥本身可以被加密。
被加密的私钥格式如下
当采用pfx格式证书时,由于pfx格式文件本身可能需要**来解密,而里面的私钥也可能需要**解密,所以解析程序往往可能让你输入2个**,这2个**是用来解密不同层级数据的,注意不要感到疑惑或者将两者混淆。
证书类型
签名算法一般采用RSA或者ECC。较老的有DH算法等,目前已不多见。
但是注意,被称为RSA证书并不是指证书是被RSA算法签名的,而是指证书本身的公钥、私钥是RSA。同理ECC证书指的是证书的公钥和私钥具有椭圆曲线属性。证书的签名值并不影响证书的属性。
例如,上级证书A是ECC证书,即证书公钥私钥是ECC属性的,那么由它生产的证书B的签名必然采用ECC签名,但是B本身可以使用RSA公钥私钥或者ECC公钥私钥。
证书拓展
使用wireshark解析SSL证书,我们可以清晰的看到数字证书各个字段,这里我们关心证书中的extension
1:keyusage/extkeyusage
用以描述证书的用法,改证书可以进行证书的签发?CRL的签发?客户端认证?服务器认证?一般严格的CA机构都谨慎设置这个字段,避免自己签发的证书被滥用。
2:subectkeyidentifier
自己公钥进行hash运算后的值,可以快速判断证书。
3:authoritykeyidentifier
上级证书的公钥进行hash运算后的值。一般来说,两个上下级关系的证书,下级证书的authoritykeyidentifier值就是上级证书的subectkeyidentifier值。
4:subjectAltname
证书的别名。例如一个网站有多个域名,例如www.baidu.com和www.hao123.com对应的都是一个服务器,common name只能写一个,为了不让浏览器告警,可以在subjectAltname拓展中添加这个网站的其他域名。浏览器收到这个证书,除了判断host和common name是否一致外,也会判断host和subjectAltname是否有一致项,有的话就成功。
5:basicConstraints
一般CA证书里面ca:Ture