证书4要素
pubkey(公钥) ,有一个其一一对应的私钥,由证书拥有者保存。
subject(名字),可以理解为证书的名字,你可以理解为 网站的域名。
issuer(颁发者的名字),即上级证书的subject。
signature(签名) ,上级证书使用私钥对当前证书进行签名的值。
证书签名
假设 有 3 级 证书
首先 ,R1 CA证书 是由 R1证书签发,而www.taobao.com
是由R1 CA证书签发。
签发过程核心就是签名,比如 签发R1 CA证书时,拿R1证书的私钥对R1 CA证书进行数字签名操作,签名的值添加在R1 CA证书中。同理签发www.taobao.com
这张证书,是用 R1 CA证书的私钥对该证书进行数字签名,签名值添加在www.taobao.com
的证书中。
被数字签名的值,是该证书的HASH。举个例子当 使用 R1证书加签R1 CA时,其签名值是 R1_privatekey_sign( HASH(R1 CA) )。
数字证书校验
由于 私钥签名的数据,可以使用公钥校验,假设我们信任R1 + R1 CA证书,我们收到www.taobao.com
这个证书,如何校验?
首先,构造证书链,即 拿 server的证书然后和本地(操作系统或者浏览器内置)的可信证书进行上级证书的查找,一般通issuer
字段查找(还有通过keyid的方式,这里不讨论),比如 www.taobao.com
的证书的issuer是R1 CA
,那么在本地仓库里面找R1 CA
,接着找R1 CA
的上级证书,直到找到最高一级的证书,即R1证书。
第二步,光靠名字来找上级是不够的,因为名字可以伪造,我们还需要对证书的签名值进行校验,我们知道,私钥签名的数据可以使用公钥来校验,所以,首先拿R1 CA证书的的公钥,去解开 www.taobao.com
签名值,然后校验其值是否是www.taobao.com
的hash,同理可以验证证书链中R1是否是R1 CA的上级证书。 签名校验成功,表明了2点
1:上下级关系正确
2:证书被未篡改,如果证书被篡改,使用上级证书的公钥解开当前证书后,会发现其值和当前证书的HASH值不一样
交叉证书
如果一个CA机构有如下2个受信的链:
那么又 R1 CA签发的证书只能由R1+R1 CA进行验证;视同 R3 CA签发的证书只能由R3+R3 CA进行签发。
但是有些客户端只有R1和R1 CA而没有R3以及R3 CA,而有些客户端只有R3和R3 CA而没有R1 以及 R1 CA ,我们能不能让证书有2条可以用来验证的链呢? 比如 www.taobao.com
->…->R1 是一条证书链, www.taobao.com
->…->R3 也算一条证书链,这样假设有些客户端只信任R1或者R3也能同时验证同一个证书。
为了达到这个目的,我们需要做这么一个操作,就是 使用 R1 对 R3进行签名生成一张叫做 R1-R3 的证书(即使用R1的私钥对R3进行签名)。
注意,R1-R3 拥有和 R3一模一样的 subject+公钥,和R3唯一的区别就是 R3是自签名证书,其issuer是R3自己,而 R1-R3 是中间证书,其issuer是R1。
接着,使用 R1-R3 来对 签发 www.taobao.com
,即 www.taobao.com
的 issuer 是R3
(上面说了,issuer就是个字符串,和上级证书的subject一样,而R1-R3 这张证书的subject就是R3),这张 R1-R3
就是所谓的交叉证书corss-certificate
。
www.taobao.com
这样的证书,如何能让只信任R1的客户端进行验证:
1、构造证书链
服务器发送 www.taobao.com
+ R1 R3
,客户端构造证书链,自然,通过找 www.taobao.com
的issuer:R3,在server发送的证书中找到了 R1 R3
这张证书 ,通过 R1 R3
的issuer:R1,在本地找到了R1。
2、验证证书链
略,通上节一致,通过上级证书的公钥验证当前证书的签名值。
www.taobao.com
这样的证书,如何能让只信任R3的客户端进行验证:
1、构造证书链
服务器发送 www.taobao.com
,客户端构造证书链,自然,通过找 www.taobao.com
的issuer:R3,在本地找到了受信的R3 ,R3是根证书,证书链构造完成。
2、验证证书链
虽然,实际上 www.taobao.com
的证书是由 R1 R3
这张证书签名的,但是上面说过,R1 R3
这张证书的公钥和R3一样,也就意味着使用R1 R3
的公钥,能够验证 www.taobao.com
的签名值。
结尾
实际上,使用R1-R3
对 www.taobao.com
签名的效果,和使用R3
对 www.taobao.com
签名的效果是一模一样的,因为R1-R3
和 R3
拥有相同的subject以及公钥,自然拥有相同的私钥。
说的通俗一点,就是CA机构通过欺骗
的方式,签了一张交叉证书,这张证书能够让客户端的证书链引导到R1。
交叉证书有什么作用?
1、兼容老设备。假设,老的客户端只支持R1根证书,但是我们的证书是R3是签名的,那需server发送交叉证书,来“引导”客户端使用R1校验。
2、CA机构合并,假设R1 收购了R3,R1为了“收回最终校验权”,可以生成这么一个交叉证书,那么使用R3签名的证书,最后都被R1来校验。
由以上可知交叉证书的关键是把Root CA2的自签名证书改为用另一机构的RootCA1来签名,RootCA1成为了RootCA2的上级CA。
转自:https://developer.aliyun.com/article/703706