证书可以理解为签发方信息、拥有者信息、公钥以及签名(由签发方私钥签名)的集合(当然还有额外信息)。校验证书是否可信,实际就是检验该证书是否是由合法的签发方签发,验证的方法就是首先通过签发方信息找到对应的签发方证书,利用签发方证书中的公钥去校验签名是否正确。
从上述验证方法可以看出,实际上证书是否可信是由其签发方的证书来进行校验的,而签发方的证书的可信是由上一层签发方的证书来校验的,如此就形成一条证书链,而最顶层的就是常说的根证书。此外有也许会问如果浏览器中找不到签发方证书怎么办?而且签发方确认是可信的,此时在TLS协商的时候,可以下发证书链。
随便搜一下TLS证书,会出现一大堆关键字:X.509, p12, pfx, pkcs, pem, csr, cer, crt, jks, crl等,这么繁杂一下就让人想从入门到放弃了,不过还是耐心梳理一下。
(一)X.509
X.509就是一个广泛应用的数字证书标准,简单来说就是定义了数字证书里面包含哪些字段,如何存储,可以参照一下RFC5280;协议中定义的参数都是采用DER编码(X.690),DER编码可以理解为一种TLV(Tag Length Value)格式编码。
以一个实际的证书内容为例,如下所示:
Certificate:
Data:
Version: 3 (0x2) //表示为X509 v3版本证书
Serial Number: 1 (0x1) //序列号,签发时需保证同一签发方所签发的每个证书都一个唯一的Serial Number
Signature Algorithm: sha256WithRSAEncryption //签名算法,先进行SHA256摘要后,使用签发方私钥进行RSA加密
Issuer: C=CN, ST=JS, L=NJ, O=Dreamer, OU=Dreamer, CN=Dreamer //签发方DN(Distingushed Name),见后续说明
Validity //证书有效期
Not Before: Jul 29 14:02