据我了解,任何使用X.509证书的软件都可以自行决定证书是否可信.
AFAIK OpenSSL只是查询一个列表(例如,/ etc/ssl/certs)并检查证书是否存在.
有没有办法让OpenSSL列出它信任的所有证书?我知道我可以查阅自己的文件(在我的OpenSSL的具体安装),但有一个(安装独立的)方式来获得自身的OpenSSL信任列表?
我最近调查了这个,发现无法让OpenSSL列出其可信集中的证书.我发现,最好的方法是"自己查阅文件[/ etc/ssl/certs](在我特定的OpenSSL安装上)".
您可以更加独立于安装,找到OpenSSL参考的目录. openssl version -d
打印它的路径.
% openssl version -d OPENSSLDIR: "/opt/local/etc/openssl"
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 {} \+
这将打印出OpenSSL期望包含证书的文件的全部内容.如果您想要少于整个文件,请cat
使用适当的命令替换.
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)
请注意,因为它的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)
接下来,您可以通过转到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)
你并不像拥有数百个CA和下属CA的浏览器那么糟糕,但是你已经接近了:
$ cat cacert.pem | grep -o "\-\-\-\-\-BEGIN" | wc -l 153
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可信证书的路径?.