希望通读这篇文章,初学者可以较为深入的了解数字证书的发展、原理及应用,熟练者可以查漏补缺。
如果想要了解HTTPS协议,那么数字证书就是一个逃不过的坎,在HTTPS协议握手加密过程中,数字证书有着举足轻重的地位。
本文将从以下几个方面展开:
- 加密/解密的基础概念
- 数字证书的构成及原理
- 数字证书的应用——HTTPS协议
加密/解密的基础概念
密钥: 一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。
对称加密算法(symmetric key algorithms
):加密和解密使用相同密钥的加密算法。因此对称加密算法对密钥安全性要求非常高,如果密钥泄露,消息就等于明文传输。常见的对称加密算法有AES
、DES
等。
非对称加密算法(asymmetric key algorithms
):加密使用的密钥和解密使用的密钥不相同的加密算法。非对称加密算法中,会生成一对公钥和私钥,公钥和加密算法会公开使用,但是私钥绝对保密。私钥加密的密文可以公钥使用者解密,而公钥加密的密文只有私钥才能解密。常见的非对称加密算法有RSA
、ECC
(椭圆曲线加密算法)等,其中RSA
使用最广泛。
对称加密算法的速度一般远高于非对称加密算法。所以一般加密通信是采用非对称加密算法交换对称加密算法密钥,再使用对称加密算法进行数据加密通信。但这种方式的一个难点就是如何将公钥和算法安全且正确“给到”使用者手上。
假如在通信过程中,黑客拦截客户端与服务器之间的通信成为中间人,将自己的公钥发送给客户端,如果客户端没有能力识别公钥是否来自真正的服务器,那么数据就会泄露。如同下面这种情况,引自数字证书原理:
“客户”->“黑客”:你好 //黑客截获“客户”发给“服务器”的消息
“黑客”->“客户”:你好,我是服务器,这个是我的公钥 //黑客自己生成一对公钥和私钥,把公钥发给“客户”,自己保留私钥
“客户”->“黑客”:向我证明你就是服务器
“黑客”->“客户”:你好,我是服务器 {你好,我是服务器}[黑客自己的私钥|RSA] //客户收到“黑客”用私钥加密的信息后,是可以用“黑客”发给自己的公钥解密的,从而会误认为“黑客”是“服务器”
数字证书就是用来解决这个问题的,它让客户端有能力去识别公钥是否来自合法的服务器。
数字证书的构成和原理
证书的构成

-
颁发者(证书的发布机构)
表示该证书是哪个机构发布的,这个机构是证书链非常重要的一环。对于图中的证书而言,"GeoTrust RSA CA 2018"就是这个机构。一般而言这些机构都是极具信誉的大机构。 -
有效期从, 到 (证书的有效期)
表示该证书的有效期。比如该证书就是2018年11月7日 8:00:00至2020年11月6日 20:00:00,超过期限证书就会作废,需重新申请 -
公钥(证书持有者的公钥)
用于加解密传输的消息,从图中可以看到这个证书的公钥是2048位的,就是一长串16进制的数字 -
使用者(证书持有者)
表示证书的持有者,或者说证书颁发的对象,一般包括公司、机构或者网站名等。图中证书使用者就是北京创新乐知信息技术有限公司旗下的*.csdn.net网址。 -
签名哈希算法(指纹算法,摘要算法)
对证书主体内容进行哈希的算法,可以获得证书主体内容的摘要。这个摘要就是证书的指纹,最终用于证书数字签名和证书认证。
-
指纹
一个散列值,主要功能是确认证书完备性,即确认证书未被篡改。 -
签名算法
数字签名所使用的加密算法,使用CA的私钥加密。
证书的签名-验签过程

-
签名
- 使用签名哈希算法(指纹算法,如
sha256
)计算证书颁发者信息、证书持有者信息、证书有效期、证书持有者公钥等信息并生成证书摘要(即指纹α
,一串散列值); - 颁发者生成一对私钥和公钥,使用私钥对指纹加密,加密后的数据就是颁发者的数字签名
γ
; - 将数字签名
γ
“附加”到数字证书上,变成一个签过名的数字证书; - 颁发者将签过名的数字证书和公钥一起给到证书持有者。
- 使用签名哈希算法(指纹算法,如
-
验签
- 使用者通过某种途径(如浏览器访问)拿到签过名的数字证书,解析后可以获得数字签名
γ
和数字证书; - 使用者使用数字证书中的指纹算法计算一遍数字证书相关内容,生成一个指纹
β
; - 同时使用通过某些方式拿到的颁发者的公钥解密数字签名,拿到解密后的指纹
α
; - 对比两个指纹
α
和β
,如果相同,表明证书合法,可以信任并使用该证书中的信息(如持有者的公钥)。
- 使用者通过某种途径(如浏览器访问)拿到签过名的数字证书,解析后可以获得数字签名
在签名-验签流程中,一个核心是确保颁发者是可信的,即保证使用者拿到的公钥是证书颁发者的,那么如何确保颁发者是可信的呢,这就涉及到了证书链。
证书链

-
root
:根证书,权威证书认证机构(CA
,Certificate Authority
)给自己颁发的数字证书,也就是自己认证自己。在上图中就是根证书就是由就是DigiCert Global Root CA
自己给自己签发的。 -
intermediates
:中间证书,根CA
生成一对公钥、私钥,并用私钥将中间CA
的信息和公钥进行“加密”生成签名,封装得到中间证书。需要注意的是,中间CA
可能不止一个。上一级CA
同样按照这个逻辑给下一级CA
进行签发证书。在这里中间CA
就是GeoTrust RSA CA 2018
,它给末端使用者签发证书。 -
end-user
:末端使用者(证书)。图中的末端证书就是*.csdn.net
使用的数字证书。
可以看到证书链由多个证书一层一层组成的,其中除了末端证书的公钥是给用户加密报文外,其他层证书中的公钥均用于解密下一层的证书指纹签名。最高层的根证书是自签名的,也就是自己颁发给自己,所以根证书一定是可信的。一般微软等公司会根据一些权威安全机构的评估选取一些信誉很好并且通过一定的安全认证的证书发布机构,把这些证书发布机构的证书默认就安装在操作系统里面了,并且设置为操作系统信任的数字证书。其最终效果就是一条信任链:证书A
让证书B
证明自己可信,而证书B
又找证书C
证明自己可信,一直到根证书自己给自己证明身份。在当前图片中的证书路径中,其证书链如下:

根CA
:DigiCert Global Root CA
给中间CA
:GeoTrust RSA CA 2018
颁发数字证书,GeoTrust RSA CA 2018
给 *.csdn.net
颁发数字证书。当客户端(比如浏览器)拿到 *.csdn.net
的数字证书时,就会获得数字证书和数字签名,于是沿着证书请求认证,到DigiCert Global Root CA
的根证书时,因为根证书可信任,于是使用根证书的公钥解密GeoTrust RSA CA 2018
的证书,拿到GeoTrust RSA CA 2018
的证书的公钥后,解密 *.csdn.net
的证书,最终确保拿到的 *.csdn.net
的证书可信,安全使用该证书中的公钥。
HTTPS通信过程
这张图应该清晰看到数字证书在HTTPS请求中的重要地位。后面找时间写一篇HTTPS请求相关的。
