我遇到问题curl
和openssl
报告客户端证书已过期,即使它不是将来的日期:
# echo | openssl s_client -showcerts -connect example.com:443 2>&1 | grep Verify
Verify return code: 10 (certificate has expired)
但是
# echo | openssl s_client -showcerts -connect example.com:443 2>&1 | openssl x509 -noout -dates
notBefore=Oct 17 00:00:00 2011 GMT
notAfter=Oct 21 12:00:00 2014 GMT
系统日期正确无误。 Firefox也没有显示该网站证书的任何错误。我尝试过的Openssl版本是OpenSSL 1.0.1e-fips 11 Feb 2013
和OpenSSL 1.0.1f 6 Jan 2014
。我发现了一个类似的问题here,其中作者声称openssl 0.9.8中缺少该问题,但存在于1.0.1中。
为什么会这样?
答案 0 :(得分:3)
我的问题是证书确实过期了,但不是这个特定的证书,而是签名链中的证书。
例如,对于Google,此命令openssl s_client -showcerts -connect google.com:443 </dev/null | openssl x509 -noout -dates
显示:
notBefore=Oct 6 12:37:54 2016 GMT
notAfter=Dec 29 12:28:00 2016 GMT
然而,只有openssl s_client -showcerts -connect google.com:443 </dev/null
不显示1,而是3个证书(包含在---BEGIN/END CERTIFICATE---
个部分中),第一个是google,它是实际检查过的。为了验证这一点,我复制了(可能应该采用较少的手动方式)第一个到/tmp/google
,最后一个到/tmp/geotrust
,现在正在运行openssl x509 -noout -dates < /tmp/google
给我:
notBefore=Oct 6 12:37:54 2016 GMT
notAfter=Dec 29 12:28:00 2016 GMT
哪个匹配第一个命令的输出,openssl x509 -noout -dates < /tmp/geotrust
:
notBefore=May 21 04:00:00 2002 GMT
notAfter=Aug 21 04:00:00 2018 GMT
哪个不同,以前没有显示过。所以最后我的问题是,其中一个更高权威的证书确实已经过时了。
BTW作为对问题的评论建议升级操作系统来解决这个问题 - 我想原因是一样的。操作系统附带了一堆根证书,所以如果你有疯狂的旧操作系统,其中一些可能会过期,你可以升级那些根证书,或整个操作系统来解决问题。
也很方便地知道在没有showcerts
的情况下运行可以很好地查看证书链 - openssl s_client -connect google.com:443 </dev/null
:
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
i:/C=US/O=Google Inc/CN=Google Internet Authority G2
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
所有这些都不需要过期。
答案 1 :(得分:0)
如果您只执行ImageTypes.values().collect() { it.name() }
,它应该在openssl s_client -connect <server>:<port>
行之后显示给您,如下所示:
Verify...
基本上,此失败消息在证书链中提到未验证的证书及其发生的原因。
答案 2 :(得分:0)
我今天遇到了类似的问题,并在这里冲浪以寻找答案。幸运的是,我自己得到了答案。 这是我得到它的方式:
话虽如此,请检查您的本地信任存储中是否有任何已过期的中间/根证书(对于 openssl,可能是 /usr/lib/ssl/certs/),这“毒害”了 openssl 客户端的验证命令或 curl 命令。