美文网首页
X.509 数字证书浅析

X.509 数字证书浅析

作者: VictorHong | 来源:发表于2020-08-25 21:58 被阅读0次

    简单来说,数字证书就是一张附带了数字签名的信息表。

    X.509证书

    数字证书的签署

    根认证机构的构建

    简要流程

    1. 根认证机构「CA」生成公钥 ca_KeyPub 和私钥 ca_KeyPri,以及基本信息表 ca_Infoca_Info 中一般包含了「CA」的名称、证书的有效期等信息。
    2. 根认证机构「CA」对(ca_KeyPub + ca_Info)进行散列运算,得到散列值 ca_Hash
    3. 根认证机构「CA」使用其私钥 ca_KeyPrica_Hash 进行非对称加密,得到加密的散列值 enc_ca_Hash
    4. 根认证机构「CA」将(ca_KeyPub + ca_Info + enc_ca_Hash)组合生成自签名的数字证书「ca_Cert」。这张证书称之为根证书。

    根证书「ca_Cert」包含的内容:ca_KeyPub + ca_Info + enc_ca_Hash

    根认证机构

    「ca_Cert」可用于签署下一级的证书。

    单级认证机构的证书签署

    简要流程

    1. 服务器「S」生成公钥 s_KeyPub 和私钥 s_KeyPri,以及基本信息表 s_Infos_Info 中一般包含了「S」的名称、证书要求的有效期等信息。
    2. 服务器「S」将 s_KeyPubs_Info 送给根认证机构「CA」。
    3. 根认证机构「CA」通过某种方式验证「S」的身份之后,再加上根认证机构自己的一些信息 ca_Info,然后对它们(s_KeyPub + s_Info + ca_Info)进行散列运算,得到散列值 s_Hash
    4. 根认证机构「CA」使用其私钥 ca_KeyPris_Hash 进行非对称加密,得到加密的散列值 enc_s_Hash
    5. 根认证机构「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」不可用于签署下一级的证书。

    二级(或以上)认证机构的构建

    在现实中,仅仅靠一个认证机构是满足不了海量证书签署需求的,因此需要构建分支认证机构。

    简要流程

    1. 二级认证机构「CA2」生成公钥 ca2_KeyPub 和私钥 ca2_KeyPri,以及基本信息表 ca2_Infoca2_Info 中一般包含了「CA2」的名称、证书要求的有效期等信息。
    2. 二级认证机构「CA2」将 ca2_KeyPubca2_Info 送给根认证机构「CA」。
    3. 根认证机构「CA」通过某种方式验证「CA2」的身份之后,再加上根认证机构自己的一些信息 ca_Info,然后对它们(ca2_KeyPub + ca2_Info + ca_Info)进行散列运算,得到散列值 ca2_Hash
    4. 根认证机构「CA」使用其私钥 ca_KeyPrica2_Hash 进行非对称加密,得到加密的散列值 enc_ca2_Hash
    5. 根认证机构「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」可用于签署下一级的证书。

    三级或更多级认证机构的构建流程跟这个流程差不多,这里就不再赘述了。

    二级(或以上)认证机构的证书签署

    简要流程

    1. 服务器「S2」生成公钥 s2_KeyPub 和私钥 s2_KeyPri,以及基本信息表 s2_Infos2_Info 中一般包含了「S2」的名称、证书要求的有效期等信息。
    2. 服务器「S2」将 s2_KeyPubs2_Info 送给二级认证机构「CA2」。
    3. 二级认证机构「CA2」通过某种方式验证「S2」的身份之后,再加上根认证机构自己的一些信息 ca2_Info,然后对它们(s2_KeyPub + s2_Info + ca2_Info)进行散列运算,得到散列值 s2_Hash
    4. 二级认证机构「CA2」使用其私钥 ca2_KeyPris2_Hash 进行非对称加密,得到加密的散列值 enc_s2_Hash
    5. 二级认证机构「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」已经安装到操作系统中且被信任。下同。)

    1. 服务器「S」下发证书「s_Cert」给客户端「C」。
    2. 客户端「C」检查到「s_Cert」中的 ca_Info,发现它是由「CA」签署的。
    3. 客户端「C」取出「ca_Cert」中的 ca_KeyPub,对「s_Cert」中的 enc_s_Hash 进行解密得到 s_Hash
    4. 客户端「C」对「s_Cert」中的(s_KeyPub + s_Info + ca_Info)进行散列运算,得到散列值 s_Hash_tmp
    5. 客户端「C」判断 s_Hashs_Hash_tmp 是否相等。如果两者相等,则证明「s_Cert」是由「ca_Cert」签署的。
    6. 客户端「C」检查「ca_Cert」,发现该证书是根证书,且已经被系统信任,身份验证通过。

    如果「ca_Cert」没有安装到系统中,那么将无法对 enc_s_Hash 进行解密,也就无法验证「s_Cert」的真实性了。下同。

    二级(或以上)认证机构的验证

    简要流程

    1. 服务器「S2」下发证书「s2_Cert」「ca2_Cert」给客户端「C」。
    2. 客户端「C」检查到「s2_Cert」中的 ca2_Info,发现它是由「CA2」签署的。
    3. 客户端「C」取出「ca2_Cert」中的 ca2_KeyPub,对「s2_Cert」中的 enc_s2_Hash 进行解密得到 s2_Hash
    4. 客户端「C」对「s2_Cert」中的(s2_KeyPub + s2_Info + ca2_Info)进行散列运算,得到散列值 s2_Hash_tmp
    5. 客户端「C」判断 s2_Hashs2_Hash_tmp 是否相等。如果两者相等,则证明「s2_Cert」是由「ca2_Cert」签署的。
    6. 客户端「C」检查到「ca2_Cert」中的 ca_Info,发现它是由「CA」签署的。
    7. 客户端「C」取出「ca_Cert」中的 ca_KeyPub,对「ca2_Cert」中的 enc_ca2_Hash 进行解密得到 ca2_Hash
    8. 客户端「C」对「ca2_Cert」中的(ca2_KeyPub + ca2_Info + ca_Info)进行散列运算,得到散列值 ca2_Hash_tmp
    9. 客户端「C」判断 ca2_Hashca2_Hash_tmp 是否相等。如果两者相等,证明「ca2_Cert」是由「ca_Cert」签署的。
    10. 客户端「C」检查「ca_Cert」,发现该证书是根证书,且已经被系统信任,身份验证通过。

    三级或更多级认证机构证书验证流程跟这个流程差不多,就是一环扣一环地验证下去。

    加密传输的数据

    服务器「S」的身份得到客户端「C」的认可之后,服务器「S」可以使用 s_KeyPri 对传出的数据进行加密或者对传入的数据进行解密。

    反过来,客户端「C」可以使用 s_KeyPub 对传出的数据进行加密或者对传入的数据进行解密。

    由于非对称加密的效率较低,所以一般使用非对称加密协商并交换一个临时的会话密钥之后,使用会话密钥进行对称加密。

    现实中的证书验证

    现实中,一些众所周知且被信任证书认证机构的根证书都被内置到了操作系统中。

    而客户端在检查服务器证书的时候,一般还会检查它的有效期以及该证书是否在认证机构的证书吊销列表中。证书吊销列表一般是在线检查的。


    参考:

    1. X.509数字证书的结构与解析
    2. X.509 数字证书的基本原理及应用

    相关文章

      网友评论

          本文标题:X.509 数字证书浅析

          本文链接:https://www.haomeiwen.com/subject/adktsktx.html