介绍
参考链接:
结构
{
"tbsCertificate":{
"version":2, // 版本,X509v3=2
"serialNumber":"2cee193c188278ea3e437573", // 证书流水号,为长正整数。但可以使用hexstring表示。流水号在CA内唯一,即CA + serialNumber 构成一个全局唯一的id。最长不超过20字节
"signature":{ // 与外部signatureAlgorithm具有相同的算法标识,但参数可以不同
},
"issuer":{ // 证书颁发者
"rdnSequence":[ // DN = Distinguished Name
{
"id":"...", // 3字节长度,标识后序的数据类型.每一个rdnSeqence结构:3字节id + '\r' + 1字节数据长度 + 数据可取:countryName, stateOrProvinceName,localityName,organizationalUnitName=部门名称,organizationName=公司名,commonName=baidu
"data":... // 对应的数据
}
]
},
"validity":{
"notBefore":... , // 起始时间
"notAfter":..., // 结束时间
},
"subject":{ // 主体名称,和issuer结构相同
},
"subjectPublicKeyInfo":{,// 主体公钥信息
"algorithm":"..", // 算法
"subjectPublicKey":{
"modulus":"..." // 模
"publicExponent":..// 3字节的指数, 如65537
}
}
"extensions":[{ // 扩展
"extnId":"..", // id
"critical":true, //
"value":"..." // 二进制数据
},
{
"extnId":"id-ce-subjectAltName", // 2.5.29.17 Subject Alternative Name,包含:域名信息,IP信息等
"value":["91.com","*.baidu.com"], // 域名信息
}
]
},
"signatureAlgorithm":"", // signatureValue签名的计算算法以及相关的参数(额外的参数根据ANS.1语法解析)
"signatureValue": "..." // 根据tbsCertificate计算的签名,用于校验完整性。注意签名的对象是ANS.1编码后的对象,而不是原对象。注意,该签名后的值可能包含padding(头部为0),校验时需要把这些padding忽略。
}
Because the subject alternative name is considered to be definitively
bound to the public key, all parts of the subject alternative name
MUST be verified by the CA.
Subject Alternative Name与证书是绑定在一起的,因此CA在颁发证书时,必须验证这一点;同样,客户端必须根据Subject Alternative Name来校验证书是否合法。
签名规则
下面以一个TLS实例展示证书的签名规则。
如上图所示,签名部分(去掉ASN.1 DER编码的头部)由padding+encrypted
组成,在解密签名时,首先要把padding
部分去掉。
从Wireshark将signedCertificate
导出为certificate_signed_certificate_body_der.bin
文件,将签名的encrypted
部分导出为certificate_signature_encrypted.bin
文件
生成sha256
的摘要:
openssl dgst -sha256 -binary -out certificate_sha256 certificate_signed_certificate_body_der.bin
使用下面的命令验证签名:
openssl rsautl -verify -inkey pubkey.pem -pubin -in certificate_signature_encrypted.bin -asn1parse
注意: 签名 = 加密的hash