如何列出OpenSSL信任的证书?

Kon*_*yak 16 openssl truststore

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

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

有没有办法让OpenSSL列出它信任的所有证书?我知道我可以查阅自己的文件(在我的OpenSSL的具体安装),但有一个(安装独立的)方式来获得自身的O​​penSSL信任列表?

jww*_*jww 14

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

不,默认情况下OpenSSL不信任任何内容.你必须指导它信任什么.甚至有一个FAQ主题覆盖它:为什么<SSL program>失败并出现证书验证错误?:

此问题通常由日志消息指示,例如"无法获取本地颁发者证书"或"自签名证书".验证证书时,其根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)
Run Code Online (Sandbox Code Playgroud)

请注意,因为它的OpenSSL上述失败不信任GeoTrust的全球CA默认.实际上,链中还有另一个信任点,那就是谷歌互联网管理局G2.

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

$ 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)
Run Code Online (Sandbox Code Playgroud)

接下来,您可以通过转到cURL并下载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)
Run Code Online (Sandbox Code Playgroud)

你并不像拥有数百个CA和下属CA的浏览器那么糟糕,但是你已经接近了:

$ cat cacert.pem | grep -o "\-\-\-\-\-BEGIN" | wc -l
     153
Run Code Online (Sandbox Code Playgroud)

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

这种情况在过去发生过,将来很可能会再次发生.有关PKIX有趣业务的良好历史,请参阅CAcert的风险历史.例如,您知道Google Internet Authority G2和GeoTrust Global CA会对Google的网站进行认证.荷兰CA称Diginotar没有理由声称对其进行认证,或法国网络防御机构声称对其进行认证.

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

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


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

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


另请参阅如何找到openssl可信证书的路径?.

  • 这个答案在技术上是正确的,但对于几乎所有 OpenSSL 的实际使用来说都是不准确的。来自下面的评论:“如果您从源代码安装 OpenSSL,您将不会安装任何受信任的证书存储。如果您使用发行版的包管理器,发行版打包可能包含对发行版维护者决定信任的任何证书包的依赖项,所以你确实得到了一个填充的信任存储。” 由于如果您不知道要信任哪些根证书,SSL/TLS 就毫无用处,因此几乎所有 OpenSSL 的实际安装都将配置受信任的根证书。 (3认同)
  • OpenSSL当然可以“自动”信任某些证书:可以在“ cert.pem”文件或“ certs /”子目录中的“ OpenSSL文件目录”中找到任何证书。来源:[_OpenSSL可以识别哪些证书颁发机构?_](https://www.madboa.com/geek/openssl/#what-c​​ertificate-authorities-does-openssl-recognize)。现在,可能是您的安装在此目录中没有任何内容,但是我的安装中有一个“ cert.pem”符号链接到根证书颁发机构证书的集合,因此我的OpenSSL安装“自动”信任许多站点。 (2认同)
  • “不需要”是一个糟糕的答案。想看看这个问题的实际答案 (2认同)

Jim*_*unt 8

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

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

% openssl version -d
OPENSSLDIR: "/opt/local/etc/openssl"
Run Code Online (Sandbox Code Playgroud)

OpenSSL在这里查找名为的文件cert.pem和子目录certs/.它找到的证书被视为受信任openssl s_client和openssl verify(来源:文章,OpenSSL识别哪些证书颁发机构?).

所以,你可以这样做:

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

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