X.509 数字证书浅析
X.509证书简单来说,数字证书就是一张附带了数字签名的信息表。
数字证书的签署
根认证机构的构建
简要流程
- 根认证机构「CA」生成公钥
ca_KeyPub
和私钥ca_KeyPri
,以及基本信息表ca_Info
。ca_Info
中一般包含了「CA」的名称、证书的有效期等信息。 - 根认证机构「CA」对(
ca_KeyPub
+ca_Info
)进行散列运算,得到散列值ca_Hash
。 - 根认证机构「CA」使用其私钥
ca_KeyPri
对ca_Hash
进行非对称加密,得到加密的散列值enc_ca_Hash
。 - 根认证机构「CA」将(
ca_KeyPub
+ca_Info
+enc_ca_Hash
)组合生成自签名的数字证书「ca_Cert」。这张证书称之为根证书。
根证书「ca_Cert」包含的内容:ca_KeyPub
+ ca_Info
+ enc_ca_Hash
。
「ca_Cert」可用于签署下一级的证书。
单级认证机构的证书签署
简要流程
- 服务器「S」生成公钥
s_KeyPub
和私钥s_KeyPri
,以及基本信息表s_Info
。s_Info
中一般包含了「S」的名称、证书要求的有效期等信息。 - 服务器「S」将
s_KeyPub
、s_Info
送给根认证机构「CA」。 - 根认证机构「CA」通过某种方式验证「S」的身份之后,再加上根认证机构自己的一些信息
ca_Info
,然后对它们(s_KeyPub
+s_Info
+ca_Info
)进行散列运算,得到散列值s_Hash
。 - 根认证机构「CA」使用其私钥
ca_KeyPri
对s_Hash
进行非对称加密,得到加密的散列值enc_s_Hash
。 - 根认证机构「CA」将(
s_KeyPub
+s_Info
+ca_Info
+enc_s_Hash
)组合签署成数字证书「s_Cert」并回送给「S」。
服务器证书「s_Cert」包含的内容:s_KeyPub
+ s_Info
+ ca_Info
+ enc_s_Hash
。
「s_Cert」不可用于签署下一级的证书。
二级(或以上)认证机构的构建
在现实中,仅仅靠一个认证机构是满足不了海量证书签署需求的,因此需要构建分支认证机构。
简要流程
- 二级认证机构「CA2」生成公钥
ca2_KeyPub
和私钥ca2_KeyPri
,以及基本信息表ca2_Info
。ca2_Info
中一般包含了「CA2」的名称、证书要求的有效期等信息。 - 二级认证机构「CA2」将
ca2_KeyPub
、ca2_Info
送给根认证机构「CA」。 - 根认证机构「CA」通过某种方式验证「CA2」的身份之后,再加上根认证机构自己的一些信息
ca_Info
,然后对它们(ca2_KeyPub
+ca2_Info
+ca_Info
)进行散列运算,得到散列值ca2_Hash
。 - 根认证机构「CA」使用其私钥
ca_KeyPri
对ca2_Hash
进行非对称加密,得到加密的散列值enc_ca2_Hash
。 - 根认证机构「CA」将(
ca2_KeyPub
+ca2_Info
+ca_Info
+enc_ca2_Hash
)组合签署成数字证书「ca2_Cert」并回送给「CA2」。
二级认证机构证书「ca2_Cert」包含的内容:ca2_KeyPub
+ ca2_Info
+ ca_Info
+ enc_ca2_Hash
。
「ca2_Cert」可用于签署下一级的证书。
三级或更多级认证机构的构建流程跟这个流程差不多,这里就不再赘述了。
二级(或以上)认证机构的证书签署
简要流程
- 服务器「S2」生成公钥
s2_KeyPub
和私钥s2_KeyPri
,以及基本信息表s2_Info
。s2_Info
中一般包含了「S2」的名称、证书要求的有效期等信息。 - 服务器「S2」将
s2_KeyPub
、s2_Info
送给二级认证机构「CA2」。 - 二级认证机构「CA2」通过某种方式验证「S2」的身份之后,再加上根认证机构自己的一些信息
ca2_Info
,然后对它们(s2_KeyPub
+s2_Info
+ca2_Info
)进行散列运算,得到散列值s2_Hash
。 - 二级认证机构「CA2」使用其私钥
ca2_KeyPri
对s2_Hash
进行非对称加密,得到加密的散列值enc_s2_Hash
。 - 二级认证机构「CA2」将(
s2_KeyPub
+s2_Info
+ca2_Info
+enc_s2_Hash
)组合签署成数字证书「s2_Cert」并回送给「S2」。
服务器证书「s2_Cert」包含的内容:s2_KeyPub
+ s2_Info
+ ca2_Info
+ enc_s2_Hash
。
「s2_Cert」不可用于签署下一级的证书。
三级或更多级认证机构证书签署流程跟这个流程差不多,也不再赘述了。
从上面可以看出,证书签署的流程是:「ca_Cert」-> 「ca2_Cert」->「s2_Cert」。它是一条完整的链条,我们把它称之为「证书链」。
现实中的证书签署
现实中的证书大多数是由二级认证机构签署的。
并且,以某种方式(如 DNS)对服务器的身份进行验证之后,一般无需让服务器提供任何信息(CSR 文件)。
认证机构会提供证书、证书链以及私钥,服务器直接使用就好了。
服务器的配置
如果服务器「S」使用的证书是由根认证机构「CA」直接签署的,那么只需要向客户端提供「s_Cert」,然后自己使用私钥 s_KeyPri
即可实现非对称加密。
如果服务器「S2」使用的证书不是由根认证机构「CA」直接签署的,则不仅需要向客户端提供「s2_Cert」,而且还要提供除根认证机构「CA」之外所有认证机构的证书(这里还要提供「ca2_Cert」),否则客户端可能会提示证书链不完整而无法通过验证。服务器自己使用私钥 s2_KeyPri
即可实现非对称加密。
客户端验证服务器的身份
单级认证机构的验证
简要流程
(假设根认证机构「CA」的根证书「ca_Cert」已经安装到操作系统中且被信任。下同。)
- 服务器「S」下发证书「s_Cert」给客户端「C」。
- 客户端「C」检查到「s_Cert」中的
ca_Info
,发现它是由「CA」签署的。 - 客户端「C」取出「ca_Cert」中的
ca_KeyPub
,对「s_Cert」中的enc_s_Hash
进行解密得到s_Hash
。 - 客户端「C」对「s_Cert」中的(
s_KeyPub
+s_Info
+ca_Info
)进行散列运算,得到散列值s_Hash_tmp
。 - 客户端「C」判断
s_Hash
和s_Hash_tmp
是否相等。如果两者相等,则证明「s_Cert」是由「ca_Cert」签署的。 - 客户端「C」检查「ca_Cert」,发现该证书是根证书,且已经被系统信任,身份验证通过。
如果「ca_Cert」没有安装到系统中,那么将无法对
enc_s_Hash
进行解密,也就无法验证「s_Cert」的真实性了。下同。
二级(或以上)认证机构的验证
简要流程
- 服务器「S2」下发证书「s2_Cert」、「ca2_Cert」给客户端「C」。
- 客户端「C」检查到「s2_Cert」中的
ca2_Info
,发现它是由「CA2」签署的。 - 客户端「C」取出「ca2_Cert」中的
ca2_KeyPub
,对「s2_Cert」中的enc_s2_Hash
进行解密得到s2_Hash
。 - 客户端「C」对「s2_Cert」中的(
s2_KeyPub
+s2_Info
+ca2_Info
)进行散列运算,得到散列值s2_Hash_tmp
。 - 客户端「C」判断
s2_Hash
和s2_Hash_tmp
是否相等。如果两者相等,则证明「s2_Cert」是由「ca2_Cert」签署的。 - 客户端「C」检查到「ca2_Cert」中的
ca_Info
,发现它是由「CA」签署的。 - 客户端「C」取出「ca_Cert」中的
ca_KeyPub
,对「ca2_Cert」中的enc_ca2_Hash
进行解密得到ca2_Hash
。 - 客户端「C」对「ca2_Cert」中的(
ca2_KeyPub
+ca2_Info
+ca_Info
)进行散列运算,得到散列值ca2_Hash_tmp
。 - 客户端「C」判断
ca2_Hash
和ca2_Hash_tmp
是否相等。如果两者相等,证明「ca2_Cert」是由「ca_Cert」签署的。 - 客户端「C」检查「ca_Cert」,发现该证书是根证书,且已经被系统信任,身份验证通过。
三级或更多级认证机构证书验证流程跟这个流程差不多,就是一环扣一环地验证下去。
加密传输的数据
服务器「S」的身份得到客户端「C」的认可之后,服务器「S」可以使用 s_KeyPri
对传出的数据进行加密或者对传入的数据进行解密。
反过来,客户端「C」可以使用 s_KeyPub
对传出的数据进行加密或者对传入的数据进行解密。
由于非对称加密的效率较低,所以一般使用非对称加密协商并交换一个临时的会话密钥之后,使用会话密钥进行对称加密。
现实中的证书验证
现实中,一些众所周知且被信任证书认证机构的根证书都被内置到了操作系统中。
而客户端在检查服务器证书的时候,一般还会检查它的有效期以及该证书是否在认证机构的证书吊销列表中。证书吊销列表一般是在线检查的。
参考: