Ssl证书链

来自Linux78|wiki
Bob讨论 | 贡献2020年6月2日 (二) 12:11的版本 (创建页面,内容为“一般来说将自己生成的[CSR提交给签名商,他们用中级证书机构的私钥Private Key给我们的签名成证书。而他们的的证书又是通过…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

一般来说将自己生成的[CSR提交给签名商,他们用中级证书机构的私钥Private Key给我们的签名成证书。而他们的的证书又是通过Root CA颁发的(即Root CA通过它的私钥对中级机构提交的CSR进行了签名)。

Ssl-1.png

证书颁发机构是一个树形结构的。比如在验证我们XXX证书的有效性的时候,会一层层的去寻找颁发者的证书,直到自签名的根证书,然后通过相应的公钥再反过来验证下一级的数字签名的正确性。直到找到XXX的。(当然证书还有时间限制等条件)

Ssl-2.gif

如果服务器证书和链式证书用错误的顺序连接了,nginx将不能正常启动,并现实 错误信息:

SSL_CTX_use_PrivateKey_file(“ … /www.example.com.key") failed (SSL: error:0B080074:x509 certificate routines: ​ X509_check_private_key:key values mismatch)

​因为 nginx 尝试用私钥和链式证书中的第一个证书而不是服务器证书。

​浏览器通常会保存接受到的由可信任颁发机构签发的中间证书,所以频繁使用的浏览器可能已经获取过中间证书,所以遇到没有包含链式证书的服务器证书就不会出现警告。为确保服务器发送了完整的证书链,可以用 openssl 命令行工具测试,例如:

$ openssl s_client -connect www.godaddy.com:443
...
Certificate chain
0 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US
    /1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc
    /OU=MIS Department/CN=www.GoDaddy.com
    /serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)
  i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
    /OU=http://certificates.godaddy.com/repository
    /CN=Go Daddy Secure Certification Authority
    /serialNumber=07969287
1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
    /OU=http://certificates.godaddy.com/repository
    /CN=Go Daddy Secure Certification Authority
    /serialNumber=07969287
  i:/C=US/O=The Go Daddy Group, Inc.
    /OU=Go Daddy Class 2 Certification Authority
2 s:/C=US/O=The Go Daddy Group, Inc.
    /OU=Go Daddy Class 2 Certification Authority
  i:/L=ValiCert Validation Network/O=ValiCert, Inc.
    /OU=ValiCert Class 2 Policy Validation Authority
    /CN=http://www.valicert.com//emailAddress=info@valicert.com
...


​当用 SNI 测试配置的时候,指定 -servername 选项是很重要的,因为 openss 默认不使用 SNI 。

​在该示例中,www.godaddy.com 服务器证书 #0 的主体由发行者(“ i ”)签名,发行者(“ i ”)本身是证书 #1 的主体,证书 #1 签名的发行者又是 证书 #2 的主体,证书 #2 是由知名发行方 ValiCert, Inc 签名的,ValiCert, Inc. 的证书保存在浏览器的内置证书库中。

​如果缺少证书链,浏览器只能看到服务器证书 #0。