只能在一个文件中使用中间证书和根证书验证证书

Posted

技术标签:

【中文标题】只能在一个文件中使用中间证书和根证书验证证书【英文标题】:Can verify certificate only with intermediate and root certificate in one file 【发布时间】:2019-09-25 07:24:37 【问题描述】:

我在 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 握手失败并且与服务器的连接断开。我能做些什么来解决这个问题?

【问题讨论】:

【参考方案1】:
# 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。但这需要应用程序明确启用,即默认关闭。

根证书存在于 /etc/ssl/certs/ca-bundle.crt 中。该问题仅出现在 docker 容器上(基于 centos 7),在主机上它可以正常工作。由于这个验证问题,SSL 握手失败并且与服务器的连接断开。我可以做些什么来解决这个问题?

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

【讨论】:

以上是关于只能在一个文件中使用中间证书和根证书验证证书的主要内容,如果未能解决你的问题,请参考以下文章

根证书和中间证书的区别

tomcat不检查整个证书链

怎么在windows上openssl颁发代码签名证书?

验证设备的自签名证书

ca证书和服务器证书区别

联盟链系列 - 用Openssl管理CRL