如何列出OpenSSL信任的证书?

问题描述 投票:13回答:3

据我了解,任何使用X.509证书的软件都可以自行决定证书是否可信。

AFAIK OpenSSL只是查询一个列表(例如,/ etc / ssl / certs)并检查证书是否存在。

有没有办法让OpenSSL列出它信任的所有证书?我知道我可以自己查询该文件(在我特定的OpenSSL安装上),但是有一种(独立于安装的)方式从OpenSSL本身获取可信列表吗?

openssl truststore
3个回答
16
投票

AFAIK OpenSSL只是查询一个列表(例如,/ etc / ssl / certs)并检查证书是否存在。

不,默认情况下OpenSSL不信任任何内容。你必须指导它信任什么。甚至有一个FAQ主题涵盖它:Why does <SSL program> fail with a certificate verify error?

此问题通常由日志消息指示,例如“无法获取本地颁发者证书”或“自签名证书”。验证证书时,其根CA必须由OpenSSL“信任”,这通常意味着CA证书必须放在目录或文件中,并且相关程序配置为读取它。 OpenSSL程序“verify”以类似的方式运行并发出类似的错误消息:有关详细信息,请查看verify(1)程序手册页。

您还可以测试与Google的连接,以了解OpenSSL的行为:

$ openssl s_client -connect google.com:443
CONNECTED(00000003)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:0
...
Start Time: 1407377002
Timeout   : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)

请注意,上述操作失败,因为默认情况下OpenSSL不信任GeoTrust Global CA.实际上,链中还有另一个信任点,那就是谷歌互联网管理局G2。

您可以通过告诉OpenSSL要信任什么来解决问题。下面,我使用-CAfile选项与Google Internet Authority G2

$ openssl s_client -connect google.com:443 -CAfile google-ca.pem 
CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = google.com
verify return:1
...
Start Time: 1407377196
Timeout   : 300 (sec)
Verify return code: 0 (ok)

接下来,您可以通过转到cURL和download cacert.pem来充当浏览器。 cacert.pem有很多CA:

$ openssl s_client -connect google.com:443 -CAfile cacert.pem 
CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = google.com
verify return:1
...
Start Time: 1407377356
Timeout   : 300 (sec)
Verify return code: 0 (ok)

你并没有像拥有数百个CA和下属CA的浏览器那么糟糕,但是你越来越近了:

$ cat cacert.pem | grep -o "\-\-\-\-\-BEGIN" | wc -l
     153

OpenSSL安全模型与Web应用程序/浏览器安全模型形成对比,其中浏览器携带称为证书颁发机构(CA)的信任锚或信任点列表。注意:在此模型中,错误的CA可能声称对网站进行认证,并且浏览器不会更明智。

这种情况在过去发生过,将来很可能会再次发生。有关PKIX搞笑业务的良好历史,请参阅CAcert's Risk History。例如,您知道Google Internet Authority G2和GeoTrust Global CA会对Google的网站进行认证。没有理由让Dutch CA called Diginotar声称对它们进行认证,或者French Cyberdefense Agency要求对它们进行认证。

与安全模型相关:Web应用程序/浏览器模型的另一个问题是您无法打包应用程序所需的一个信任锚或CA并使用它(假设您有一个受信任的分发渠道)。您的证书会随CA Zoo一起被扔进去。其他人仍然可以声称对您的网站进行认证,并且您可以声明对其他网站进行认证。

安全模型Web应用程序降级为低价值数据的原因之一。 Web应用程序不应处理中等价值或高价值数据,因为我们无法放置所需的安全控制。


有没有办法让OpenSSL列出它信任的所有证书?

没有必要,因为该列表有0个成员:)


另见How to find out the path for openssl trusted certificate?


5
投票

我最近调查了这个,发现无法让OpenSSL列出其可信集中的证书。我发现,最好的方法是“自己查阅文件[/ etc / ssl / certs](在我特定的OpenSSL安装上)”。

您可以更加独立于安装,找到OpenSSL参考的目录。 openssl version -d打印它的路径。

% openssl version -d
OPENSSLDIR: "/opt/local/etc/openssl"

OpenSSL在这里查找名为cert.pem的文件和一个子目录certs/。它发现的证书被openssl s_clientopenssl verify视为信任(来源:文章,What certificate authorities does OpenSSL recognize?)。

所以,你可以这样做:

% find -H `openssl version -d | sed -E 's/OPENSSLDIR: "([^"]*)"/\1/'`/(cert.pem|certs) \ 
-type f -exec cat {} \+  

这将打印出OpenSSL期望包含证书的文件的全部内容。如果您想要少于整个文件,则用适当的命令替换cat


2
投票

我很想知道自从jww的回应以来这是否有所改变。

如果我提交:$ openssl s_client -connect google.com:443

它成功运行,检索4个总证书,并返回:

Start Time: 1484661709
Timeout   : 300 (sec)
Verify return code: 0 (ok)

我相信这是因为服务器应该设置为与证书一起发送验证完整链所需的任何中间证书和根证书,对吧?

© www.soinside.com 2019 - 2024. All rights reserved.