我在SSL握手期间由服务器发送了两个证书,域证书和DigiCert Global Root CA
签名的中间证书。我可以验证中间证书
# openssl verify intermediate.pem
cert2.pem: OK
但不是域证书
# openssl verify -CAfile intermediate.pem domain.pem
cert1.pem: C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
error 2 at 1 depth lookup:unable to get issuer certificate
DigiCert SHA2 Secure Server CA
是中间证书。当我同时连接中间证书和根证书时,验证才有效
# openssl verify -CAfile combined.pem cert1.pem
cert1.pem: OK
根证书存在于/etc/ssl/certs/ca-bundle.crt
中。该问题仅出现在docker容器上(基于centos 7),在主机上可以正常工作。由于此验证问题,SSL握手失败,并且与服务器的连接断开。我该怎么做才能解决此问题?
答案 0 :(得分:2)
# openssl verify -CAfile intermediate.pem domain.pem
cert1.pem: C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
error 2 at 1 depth lookup:unable to get issuer certificate
openssl希望在信任根证书之前建立信任链。中间证书可能是受信任的,但不是根证书(非自签名)。这意味着默认情况下,如果没有提供根证书,验证将失败。
-partial_chain
的较新版本中有一个选项openssl verify
,即使它不是根证书,它也可以在以可信证书结尾的情况下成功进行验证。 OpenSSL库中有一个类似的选项X509_V_FLAG_PARTIAL_CHAIN
。但这需要由应用程序显式启用,即默认情况下处于关闭状态。
根证书位于/etc/ssl/certs/ca-bundle.crt中。该问题仅出现在docker容器上(基于centos 7),在主机上可以正常工作。由于此验证问题,SSL握手失败,并且与服务器的连接断开。我该怎么做才能解决此问题?
不幸的是,不清楚根证书是否也是a)docker容器中的根证书,b)容器中具有哪种应用程序以及用于验证证书的代码是什么,以及c)服务器应用程序是否正确提供了所有中间证书。换句话说:您在openssl verify
上看到的内容可能与您对未知应用程序的体验无关。