交叉签名
为了让新根证书签发的下游证书可以在只持有旧根证书的旧设备上能通过证书验证。
于是让旧根证书根据新根证书签一个中间层证书(交叉证书)出来,然后让服务器在将包含交叉签名的证书(提高就设备上证书链构建的成功率)完整的证书链发给旧设备。 于是旧设备旧可以构建如下证书链进行验证:
旧根证书 -> 中间层证书(交叉证书) -> 新根证书 -> 下游若干中间证书 -> 要验证的证书
普通交叉
目的
新成立的CA想让自己CA_root根证书签署的下游证书可以在老设备上通过证书验证。
实现办法
CA找一家老牌CA(它的根证书在旧机器上广泛部署),让老牌CA用自己的根证书信息帮自己签署一张“中间证书”
【信任源 A:老牌CA:OLD_CA根证书】 【信任源 B:新CA:NEW_CA根证书】
(已内置于老旧设备中) (仅内置于现代设备中)
+--------------------+ +--------------------+
| Subject: Old Root | | Subject: New Root |
| Issuer: Old Root | | Issuer: New Root |
| Public-Key: K_old | | Public-Key: K_new |
| SKID: 0x1111 | | SKID: 0x2222 |
| AKID: 0x1111 | (自签) | AKID: 0x2222 | (自签)
+---------+----------+ +---------+----------+
| |
| 签发 | 签发
v v
+--------------------+ 若干中间证书
|【 CA交叉版证书 】 | |
| Subject: New Root | | 签发
| Issuer: Old Root | v
| Public-Key: K_new | 终端证书
| SKID: 0x2222 | (对应新根公钥的SKID)
| AKID: 0x1111 | (精准指向上游老牌CA)
+--------------------+
^
当向持有 NEW_CA根证书 的服务器请求证书时,服务器会将完整的证书链(直到CA交叉版证书) 发给请求者:
// 服务器发送的证书链
终端证书 | 若干中间证书 | CA交叉版证书
如果是持有NEW_CA根证书的新设备:
会在本地构建如下证书链进行验证:
NEW_CA根证书 -> 若干中间证书 —> 终端证书
本地有 NEW_CA根证书 ,如果没有其他问题,则 终端证书 验证通过
如果是只持有OLD_CA根证书的旧设备:
本地会先构造出如下证书链进行验证:
OLD_CA根证书 -> CA交叉版证书 -> 若干中间证书 —> 终端证书
如果没啥其他问题就验证通过。
如果服务器只发送终端证书,对于只持有 OLD_CA根证书 的旧设备,它最多只能(老旧的设备的证书链构建逻辑没有现在这么智能,比如当上游证书缺失时, 只会利用AIA中的上级证书信息依次下载上游证书)构建如下证书链:
NEW_CA根证书 -> 若干中间证书 —> 终端证书
所以"CA交叉版证书 -> 若干中间证书 —> 终端证书"这个关系最好能通过服务器发送完整的证书链(直到CA交叉版证书)来进行告知。
同样的原因,服务器在发送完整证书链时会倾向于包含交叉签名的版本,来增加证书链在老设备上构建成功的几率。
也不用担心由此增加了新设备构建证书链的时间,新设备有诸多策略来减少构建时间,例如Zero-Network Path Building或者CRLSet / Intermediate Preloading。 就算最后不得不下载上游证书,也只会下载一次。
自主交叉
目的
CA需要更换CA_root_old证书的公私钥/有效期/签名算法等,这会生成新的CA_root_new,CA此时又想让CA_root_new签署的下游证书可以在只持有CA_root_old 的老设备上通过证书认证。
实现办法
【旧根证书】 【新根证书】
(已内置于老旧设备中) (仅内置于现代设备中)
+--------------------+ +--------------------+
| Subject: MyCA Root | | Subject: MyCA Root |
| Issuer: MyCA Root | | Issuer: MyCA Root |
| Public-Key: K_old | | Public-Key: K_new |
| SKID: 0xAAAA | | SKID: 0xBBBB |
| AKID: 0xAAAA | (自签) | AKID: 0xBBBB | (自签)
+---------+----------+ +---------+----------+
| |
| 签发 | 签发
v v
+--------------------+ 若干中间证书
|【 CA交叉版证书 】 | |
| Subject: MyCA Root | | 签发
| Issuer: MyCA Root | v
| Public-Key: K_new | 终端证书
| SKID: 0xBBBB | (证明我是新根的公钥)
| AKID: 0xAAAA | (精准指向上游旧根)
+--------------------+
类似的,当向持有 NEW_CA根证书 的服务器请求证书时,服务器会将完整的证书链(直到CA交叉版证书)发给请求者。
注意!
中间证书也可以有交叉签名的版本!
交叉版证书和签名版证书区别
相同的地方
大致上,和证书所属有关的地方相同;例如:
Subject:CA自己的名字
PublicKey(公钥): 密钥对
Subject Key Identifier: 和公钥有关的一个唯一标识符(有2种计算方法,不能直接叫做hash值)
不同的地方
大致上,和决定证书签发者相关的地方不同。例如:
Issuer: 谁签的就是谁
Serial Number: 证书序列号,一般不同。
Authority Key Identifier (AKID):决定了去哪里找上一级
Signature Value:不同
**Not Before / Not After:**证书有效期
Signature Algorithm Identifier: 证书签名算法,大概率不同