{siteMetadata.headerTitle}
Published on

客户端如何验证证书的合法性

Authors

CA(Certificate Authority) 证书颁发机构对证书进行签名,可以避免中间人在获取证书时对证书内容进行篡改。

证书签名流程

  • 打包:CA 会把持有者的公钥,用途,颁发者,有效时间等信息进行打包,然后对这些信息进行Hash计算,得到一个Hash值。
  • 签名:然后CA用自己的私钥将该 Hash 值加密,生成 Certificate Signature
  • 添加:将 Certificate Signature 添加到证书文件中,形成数字证书

客户端验证

  • 打包:客户端使用相同的Hash算法,对证书信息进行打包,hash计算,得到一个hash值 H1
  • 公钥解密:使用CA机构的公钥对数字证书 Certificate Signature 内容进行解密,得到hash值 H2
  • 比较:如何H1和H2的值相同,则为可信证书

ps. 浏览器和操作系统通常会集成CA的公钥信息。

证书信任链

通过浏览器打开zhihu.com,baidu.com的证书详细信息,可以看到它们的证书层次结构:

# zhihu.com
DigiCert Global Root CA
    GeoTrust CN RSA CA G1
        *.zhihu.com

# baidu.com
GlobalSign
    GlobalSign RSA OV SSL CA 2018
        baidu.com

会存在中间证书来给域名证书签名,而非根证书直接对域名证书签名。

证书信任链验证流程:

  • 客户端拿到域名证书,发现证书签发者不是根证书。然后客户端根据域名证书颁发者从 服务端发送过来的证书链或者操作系统/浏览器本地获取

  • 客户端请求中间证书,发现其颁发者是根证书。然后从操作系统/浏览器本地获取根证书的公钥,验证中间证书,验证通过则中间证书可信

  • 中间证书可信之后,客户端拿到中间证书的公钥再去验证域名证书是否可信。

三级证书结构为什么更安全

  1. 降低证书被伪造的风险

三级结构将CA分为根CA和中级CA。攻击者想要伪造证书,需要伪造三级CA的签名,难度大大增加。

  1. 更好的密钥管理

根CA负责签发子CA证书,不直接签发服务器证书。如此可以使用更强的密钥保护根CA,并轮换子CA密钥。

  1. 证书撤销更灵活

若中级CA证书被破坏,可以选择撤销该中级CA,而不影响信任链中其他CA,避免大规模证书撤销。

  1. 分散信任链

不同中级CA可交叉签名,防止单一CA损害导致整个链失效。

  1. 区分业务范围

不同中级CA可颁发不同用途的证书,进行业务隔离。

  1. 更好的扩展性

新增的证书服务可以通过新增中级CA扩展,而不需要重新配置信任的根CA。

  1. 隔离内外网证书

内网证书可使用独立的中级CA,与公共CA分离,降低证书遭破坏的风险。