- Published on
客户端如何验证证书的合法性
- Authors
- Name
- Darwin Stone
- @dustred233
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
会存在中间证书来给域名证书签名,而非根证书直接对域名证书签名。
证书信任链验证流程:
客户端拿到域名证书,发现证书签发者不是根证书。然后客户端根据域名证书颁发者从 服务端发送过来的证书链或者操作系统/浏览器本地获取
客户端请求中间证书,发现其颁发者是根证书。然后从操作系统/浏览器本地获取根证书的公钥,验证中间证书,验证通过则中间证书可信
中间证书可信之后,客户端拿到中间证书的公钥再去验证域名证书是否可信。
三级证书结构为什么更安全
- 降低证书被伪造的风险
三级结构将CA分为根CA和中级CA。攻击者想要伪造证书,需要伪造三级CA的签名,难度大大增加。
- 更好的密钥管理
根CA负责签发子CA证书,不直接签发服务器证书。如此可以使用更强的密钥保护根CA,并轮换子CA密钥。
- 证书撤销更灵活
若中级CA证书被破坏,可以选择撤销该中级CA,而不影响信任链中其他CA,避免大规模证书撤销。
- 分散信任链
不同中级CA可交叉签名,防止单一CA损害导致整个链失效。
- 区分业务范围
不同中级CA可颁发不同用途的证书,进行业务隔离。
- 更好的扩展性
新增的证书服务可以通过新增中级CA扩展,而不需要重新配置信任的根CA。
- 隔离内外网证书
内网证书可使用独立的中级CA,与公共CA分离,降低证书遭破坏的风险。