背景
我们在配置HTTPS双向认证时,我们的客户端证书是由WebTrust认证的CA机构进行签发的 (买的),而且CA机构并不是根证书进行直接签发而是通过中间证书进行签发。Nginx进行配置CA证书的时候,浏览器进行验证 一直报一个证书错误 SSL certificate error 。所以引出了此文,证书的验证与合并 进行证书的判断。
证书准备
以本网站 blog.viakiba.cn 为例子,证书概述如下:
证书链如下
获取证书链中的证书
导出证书链证书
在上图中证书链一栏中,点击上层证书也可以看到证书的信息,导出证书是在详细信息一栏中下方的 复制到文件。
点击复制到文件后,可以参考此链接的后续导出 (注意 Base64 编码):https://help.aliyun.com/knowledge_detail/40743.html
证书校验
此处借助 OpenSSL 进行校验: 首先导出的三个证书都只包含本身的证书信息,不包含证书的上级证书。
证书的合并
我们一般会有三种证书: RootCA.crt(rCA,被信任的根证书)、IntermediateCA.crt(mCA,某些厂商有多个中间证书)、server.crt(sCA,通过CSR签下来的证书),某些厂商的rCA和mCA是需要用户自己下载的。为了让浏览器能够信任我们的证书,我们需要配置一条完整的证书链,证书链由sCA和mCA构成就好,rCA是浏览器内置,不需要服务器给提供。nginx配置证书链的时候,就是指定一个证书文件,这个文件中含有我们整个证书链的所有证书就好,证书合并的时候,正确的合并方法是把 mCA 合并到 sCA 中。当有多个 mCA 文件时,mCA 从下级到上级(根证书为最上级)依次合并到 sCA 中。在这个过程中,rCA 被视为多余的文件。
-----BEGIN CERTIFICATE-----
...... sCA ......
------END CERTIFICATE------
-----BEGIN CERTIFICATE-----
...... mCA (lower) ......
------END CERTIFICATE------
-----BEGIN CERTIFICATE-----
...... mCA (upper) ......
------END CERTIFICATE------
证书校验
我们可以遇到如下类的错误:
error 2 at 1 depth lookup:unable to get issuer certificate
error 2 at 2 depth lookup:unable to get issuer certificate
当CA文件缺少正确的根证书和中间证书时,会发生此错误。 要解决此问题,请确保CA文件中包含根证书和中间证书。
例如:
----BEGIN CERTIFICATE-----
[SECONDARY INTERMEDIATE CERTIFICATE]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[PRIMARY INTERMEDIATE CERTIFICATE]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[ROOT CERTIFICATE]
-----END CERTIFICATE-----
校验指令
openssl verify -CAfile