ssl - 只能使用一个文件中的中间证书和根证书来验证证书

标签 ssl ssl-certificate

我有两个由服务器在 SSL 握手期间发送的证书,即由 DigiCert 全局根 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 握手失败并且与服务器的连接被断开。我可以做什么来解决这个问题?

最佳答案

# 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 期望构建信任链直到受信任的根证书。中间证书可能是可信的,但不是根证书(不是自签名的)。这意味着如果没有提供根证书,默认情况下验证将失败。

较新版本的 openssl verify 中有一个选项 -partial_chain,该选项允许在以受信任的证书结尾时验证成功,即使这不是根证书。 OpenSSL 库中有一个类似的选项X509_V_FLAG_PARTIAL_CHAIN。但这需要由应用程序显式启用,即默认情况下处于关闭状态。

The root certificate is present in /etc/ssl/certs/ca-bundle.crt. The problem appears only on docker container (basing on centos 7), on host it works with no problems. Because of this validation problem SSL handshake fails and the connection with server is dropped. What can I do to fix this issue?

不幸的是,目前尚不清楚根证书是否a)也在docker容器中,b)容器中的应用程序类型以及使用什么代码来验证证书以及c)服务器应用程序是否正确提供所有中间证书都应该如此。换句话说:您在 openssl verify 中看到的内容可能与您对未知应用程序的体验无关。

关于ssl - 只能使用一个文件中的中间证书和根证书来验证证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58093186/

相关文章:

ssl - 证书链接错误 : PKIX path validation failed

python - GEvent PyWSGI SSL 非常慢

c# - 如何获取颁发者证书的指纹或公钥?

Android,访问系统私有(private)/公共(public)证书

firebase - 为什么我无法访问 Firebase 存储

web-services - CXF Web 服务错误 - javax.xml.ws.soap.SOAPFaultException : Unconnected sockets not implemented

authentication - 除非启用 SSL 调试,否则 Web 服务 SSL 握手在生产环境中失败

security - 登录用户的SSL?

ruby was-sdk v2:Seahorse::Client::NetworkingError 异常:SSL_connect

php - HTTPS 子域将页面重定向到主域