证书,也叫做数字证书,是网络世界中的“身份证”。证书将持有者的身份信息和公钥关联到一起,保证公钥确实是这个证书持有者的,通过证书就可以确认持有者的身份。证书由权威的、公正的、可信任的第三方机构颁发,我们把证书的颁发机构称为CA(Certificate Authority),相当于现实生活中的公安局。
为什么会有证书这个概念呢?
主要是在非对称加密中,客户端需要获取服务端的公钥信息,但是如果请求被第三方拦截的话,公钥信息就可能被替换,会导致客户端用第三方的公钥进行加密,交互信息存在泄露的风险(谁也不想自己的银行卡密码被泄露)。因此,引入证书,用于鉴别服务端的身份。如果服务端的身份鉴定失败,那么就终止请求。
那么证书的原理是什么呢?
证书颁发给使用者后,使用者就会拿着证书到处证明自己的身份。如果我们收到了一个这样的证书,怎么才能判断这个证书就是合法的,不是伪造的呢?证书中存储的有签名信息,假设交互的双方是A和B。A收到了B发过来的证书,想要验证这个证书的真伪,通过如下步骤:
1. A首先需要获取到为B颁发证书的那个CA的公钥,用这个公钥解密证书中的签名,得到摘要信息1
2. A使用证书中签名算法里面的HASH算法对证书进行HASH计算,得到一个摘要信息2。
3. A将摘要信息1和摘要信息2进行对比,如果两者一致,就说明证书确实是由这个CA颁发的(能用CA的公钥解密说明该CA确实持有私钥),并且没有被篡改过,该证书没有问题。
当然,也会同时检查证书是否在有效期内。
上述过程存在两个问题:
1. CA的公钥如何获取
2. 如何验证CA的证书是否被篡改及身份
对于问题1:B的证书中含有为B颁发证书的CA的信息,A通过该信息请求CA的证书,CA的证书中含有CA的公钥。
对于问题2:验证CA证书是否被篡改及CA的身份和A验证B的证书和身份的原理一样,首先通过摘要信息进行判断,然后找为CA颁发证书的上层CA,通过这种一层一层的方式验证身份。那么,什么时候这个验证过程才会停止呢?直到找到一个可信的CA或者验证出现了错误。操作系统中一般都会安装一些根证书,在进行身份验证的时候,如果在操作系统的根证书中验证了CA的身份,那么验证过程就可以终止了。
PS:12306网站之前是自己给自己颁发证书,众多浏览器都会提醒用户该网站不安全。
A使用CA的证书验证B的证书的过程如下图所示。
如果通信双方要互相验证对方的证书,那就要分别获取到为对方颁发证书的CA的证书。如下图所示,A如果要验证B的证书,则A必须先获取为B颁发证书的CA的证书,用CA的证书验证B的证书;B如果要验证A的证书,则B必须先获取为A颁发证书的CA的证书,用CA的证书验证A的证书。如果A和B是由同一个CA颁发的证书,那么两者获取到的CA的证书是相同的,如果A和B是由两个不同的CA颁发的证书,那么两者获取到的CA的证书是不同的。
证书属性
公钥是通过证书来向外界公开分发的,证书中必然会含有持有者的公钥信息。X.509 v3规范的证书格式中包含的关键信息如下:
l 签名算法:生成该证书的签名时所使用的HASH密码学算法和公钥密码学算法。
2 颁发者:谁颁发了这个证书,即CA的名称(验证者通过该字段去获取CA的证书)
3 主题:该证书时颁发给谁的,即证书持有者的名称。
4 公钥信息:证书持有者的公钥信息。
5 签名:CA对该证书的签名,又叫做CA的指纹信息。
证书颁发
CA颁发证书的过程如下图所示:
首先,CA使用签名算法中的HASH密码学算法(如SHA1)生成证书的摘要信息,然后使用签名算法中的公钥密码学算法(如RSA),配合CA自己的私钥对摘要信息进行加密,最终形成签名。
证书颁发方式
为网络中设备(电脑、网站、防火墙)生成证书有两种方式:
1. 先在设备上生成公私秘钥对,然后将公钥信息及设备信息提供给CA,CA根据这些信息生成证书
2. CA直接为设备生成公私秘钥对,然后为设备生成证书,最后将生成的公私秘钥对及证书导入设备中
常见的证书存储格式如下表所示:
DER |
二进制编码,后缀名.der/.cer/.crt 不包含私钥 |
PEM |
BASE 64编码,后缀名.pem/.cer/.crt 不包含私钥 |
PKCS #12 |
PKCS编码,后缀名.p12 包含私钥 |
注意:公私密钥对必须成对出现才能保证公钥密钥学正常运转,所以如果CA同时为设备生成了公私密钥对和证书,就需要将公私密钥对(主要是其中的私钥)和证书同时颁发给设备,颁发时需要根据不同情况选择证书的存储格式。例如,颁发给PC时就要选择PKCS #12格式,将私钥和证书同时颁发;颁发给防火墙时,因为防火墙只支持DER/PEM格式,所以要选择DER/PEM,同时还必须将公私密钥对以单独文件的形式颁发给防火墙。
总结一下证书的使用方法:
1、通信双方各自持有自己的证书,当一方需要向另一方证明身份时,就把自己的证书发送过去。双方不用事先保存对方的证书,只在验证时接收对方发送过来的证书即可。
2、一方验证另一方证书的真伪时,必须事先获取到为另一方颁发证书的CA的证书,用这个CA证书来验证对方的证书。
注意:因为不同的CA会颁发不同证书,所以在证书的世界中,每个人可能会持有多个证书。同理,每个人也会获取到多个不同的CA证书。在这种情况下,一方收到另一方发过来的证书时,会根据证书中颁发者的名称,在自己的系统中查找对应的CA证书,找到后就用这个CA证书来验证。如果没有找到,那就说明事先没有获取到CA证书,也就无法判断对方发送过来的证书的真伪。
通过openssl或者cryptopp加密库均可以签名,生成证书。
参考资料
《华为防火墙技术漫谈》