颁发
证书发放
如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签名后,便形成证书发给申请者。
如果一个用户想鉴别另一个证书的真伪,他就用签发那个证书CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。
根认证机构的构建
-
根认证机构「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。
单级认证机构是签名是由根证书签名的,二级认证机构是证书是由中间证书签名的。因此只介绍下二级和多级认证机构的构建。
二级(或以上)认证机构的构建
-
二级认证机构「CA2」生成公钥 ca2_KeyPub 和私钥 ca2_KeyPri,以及基本信息表 ca2_Info。ca2_Info 中一般包含了「CA2」的名称、证书要求的有效期、证书功能扩展等信息。
-
二级认证机构「CA2」将 ca2_KeyPub、ca2_Info 送给根认证机构「CA」。
-
根认证机构「CA」通过某种方式验证「CA2」的身份之后,再加上根认证机构自己的一些信息 ca_Info(Issuer,AKI),然后对它们(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」。它是一条完整的链条,我们把它称之为 「证书链」。
验证
收方在收到信息后用如下的步骤验证您的签名:
-
使用自己的私钥将信息转为明文;
-
使用发信方的公钥从数字签名部分得到原摘要;
-
收方对您所发送的源信息进行hash运算,也产生一个摘要;
-
收方比较两个摘要,如果两者相同,则可以证明信息签名者的身份。
如果两摘要内容不符,会说明什么原因呢?
可能对摘要进行签名所用的私钥不是签名者的私钥,这就表明信息的签名者不可信;也可能收到的信息根本就不是签名者发送的信息,信息在传输过程中已经遭到破坏或篡改。
作用:
-
保密性 - 只有收件人才能阅读信息。
-
认证性 - 确认信息发送者的身份。
-
完整性 - 信息在传递过程中不会被篡改。
-
不可抵赖性 - 发送者不能否认已发送的信息。
单级认证机构的验证
(假设根认证机构「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」,发现该证书是根证书,且已经被系统信任,身份验证通过。
二级(或以上)认证机构的验证
-
服务器「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」,发现该证书是根证书,且已经被系统信任,身份验证通过。