如何列出OpenSSL信任的证书?

如何列出OpenSSL信任的证书?,openssl,truststore,Openssl,Truststore,据我所知,任何使用X.509证书的软件都可能有自己的依据来决定证书是否可信 AFAIK OpenSSL只是查阅一个列表(例如,/etc/ssl/certs)并检查证书是否存在 OpenSSL有没有办法列出它信任的所有证书?我知道我可以自己查阅该文件(关于我的特定OpenSSL安装),但是有(独立于安装的)方法从OpenSSL本身获取受信任列表吗 AFAIK OpenSSL只是查阅一个列表(例如,/etc/ssl/certs)并检查证书是否存在 不,OpenSSL默认不信任任何东西。你必须告诉它该

据我所知,任何使用X.509证书的软件都可能有自己的依据来决定证书是否可信

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

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

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

不,OpenSSL默认不信任任何东西。你必须告诉它该相信什么。甚至还有一个FAQ主题涵盖了这一点:

此问题通常由日志消息指示 例如“无法获取本地颁发者证书”或“自签名” 证书”。验证证书时,其根CA必须为 OpenSSL“受信任”这通常意味着CA证书必须 放置在目录或文件中,并配置相关程序 阅读它。OpenSSL程序“验证”的行为方式与此类似 发出类似的错误消息:检查验证(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全局CA。事实上,这个链条中还有另一个信任点,那就是谷歌互联网权威G2

您可以通过告诉OpenSSL信任什么来纠正这种情况。下面,我使用
-CAfile
选项:

接下来,您可以通过“卷曲”和“卷曲”来充当浏览器
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应用程序/浏览器安全模型不同,在web应用程序/浏览器安全模型中,浏览器携带一系列信任锚或信任点,称为证书颁发机构(CA)。注意:在这个模型中,错误的CA可能声称认证了一个站点,而浏览器也不会更明智

这在过去已经发生过,将来也可能再次发生。有关PKIX有趣业务的良好历史,请参阅。例如,您知道谷歌互联网管理局G2和GeoTrust全球CA认证谷歌的网站。没有理由要求a证明他们,或要求a证明他们

与安全模型相关:web应用程序/浏览器模型的另一个问题是,您无法打包应用程序所需的一个信任锚或CA并使用它(假设您拥有受信任的分发渠道)。你的证书被扔进了加州动物园。其他人仍然可以声明认证您的站点,您也可以声明认证其他站点

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


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

不需要,因为列表有0个成员:)



另请参见。

我想知道,自jww的回应以来,这是否发生了某种变化

如果我提交: $openssl s_客户端-连接google.com:443

它工作成功,检索了总共4个证书,并返回:

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

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

我最近研究了这个问题,发现没有办法让OpenSSL在其受信任集中列出证书。正如您所指出的,我找到的最好的方法是“亲自查阅该文件[/etc/ssl/certs](关于我的特定OpenSSL安装)”

您可以更加独立于安装来查找OpenSSL所参考的目录<代码>openssl版本-d打印到它的路径

% openssl version -d
OPENSSLDIR: "/opt/local/etc/openssl"
OpenSSL在这里查找名为
cert.pem
的文件和子目录
certs/
。它发现的证书被
openssl s_客户端
openssl验证
(来源:文章,)视为受信任的证书

因此,您可以执行以下操作:

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

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

自我回答:这建议调用
SSL\u CTX\u set\u default\u verify\u path()
以信任依赖于系统的目录中的证书。

这里的行为相同。在4个不同的Linux客户端上。OpenSSL有一个可信CA列表,或者它在一个默认文件夹中查找可信CA列表。根证书是这样的:
depth=2c=US,O=GeoTrust Inc.,CN=GeoTrust Global CA
。我的系统上有一个文件
/etc/ssl/certs/GeoTrust\u Global\u CA.pem
,它可能会隐式地使OpenSSL信任。值得注意的是,
-showcerts
仍然没有实际打印此根证书。这里讨论的是两种不同的情况。如果您从源代码安装OpenSSL,则不会安装任何受信任的证书存储。如果您使用发行版的包管理器,那么发行版打包可能包括对发行版维护人员决定信任的任何证书包的依赖,因此您会得到一个填充的信任存储。服务器可以发送构成其验证路径的证书堆栈,但客户端不应信任该堆栈中的根证书,因为它可能来自任何地方,而不一定来自您信任的任何地方。OpenSSL肯定“自动”信任某些证书:“OpenSSL文件目录”中的任何证书,在名为
cert.pem
的文件或子目录
certs/
中。苏尔
% find -H `openssl version -d | sed -E 's/OPENSSLDIR: "([^"]*)"/\1/'`/(cert.pem|certs) \ 
-type f -exec cat {} \+