Openssl告知证书已经过期,但尚未过期

时间:2014-07-28 10:12:02

标签: openssl certificate

我遇到问题curlopenssl报告客户端证书已过期,即使它不是将来的日期:

# 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 2013OpenSSL 1.0.1f 6 Jan 2014。我发现了一个类似的问题here,其中作者声称openssl 0.9.8中缺少该问题,但存在于1.0.1中。

为什么会这样?

3 个答案:

答案 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)

我今天遇到了类似的问题,并在这里冲浪以寻找答案。幸运的是,我自己得到了答案。 这是我得到它的方式:

  1. 当我在一个盒子上收到“验证返回代码:10(证书已过期)”错误时,我尝试了另一个盒子,但没有收到针对同一个 SSL 站点的错误,实际上是“验证错误:num=20 :unable to get local issuer certificate"(我可以接受)
  2. 然后我认为根本原因应该在看到该错误的第一个框中。最可能的原因可能是信任存储中的一些不同的 CA 证书,尽管我仍然不知道第一个盒子在哪里
  3. 为了获取影响证书验证验证的文件,我在“openssl s_client ...”之前加上了“strace”,并仔细阅读了大输出区域中显示的文件,尤其是靠近“Verify return code: 10”的文件(证书已过期)”错误。我有 2 个可疑文件
  4. 我运行“openssl x509 -text -in {filename}”来验证这 2 个文件,并成功确认其中一个是根本原因,因为它已过期。这是中级证书

话虽如此,请检查您的本地信任存储中是否有任何已过期的中间/根证书(对于 openssl,可能是 /usr/lib/ssl/certs/),这“毒害”了 openssl 客户端的验证命令或 curl 命令。