Ssl证书链
一般来说将自己生成的[CSR提交给签名商,他们用中级证书机构的私钥Private Key给我们的签名成证书。而他们的的证书又是通过Root CA颁发的(即Root CA通过它的私钥对中级机构提交的CSR进行了签名)。
证书颁发机构是一个树形结构的。比如在验证我们XXX证书的有效性的时候,会一层层的去寻找颁发者的证书,直到自签名的根证书,然后通过相应的公钥再反过来验证下一级的数字签名的正确性。直到找到XXX的。(当然证书还有时间限制等条件)
如果服务器证书和链式证书用错误的顺序连接了,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。