【问题标题】:cURL says certificate is expired, Firefox disagreescURL 说证书已过期,Firefox 不同意
【发布时间】:2014-09-22 17:44:01
【问题描述】:

我正在尝试通过 cURL 访问一个内部站点(我可以在几天前访问)。但是,cURL 给出了错误curl: (60) SSL certificate problem: certificate has expired。如果我使用openssl 检查证书的开始日期和结束日期,它会给出一个我很好的时间范围:

echo | openssl s_client -connect internalsite.example.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Nov 30 00:00:00 2012 GMT
notAfter=Mar 30 12:00:00 2016 GMT
# For reference, the day I'm posting this is July 30th, 2014

此外,如果我在另一台计算机上使用 cURL,或通过浏览器(Firefox、Chrome 或 IE)连接,我可以正确连接。

另外,我无法在我自己的计算机上连接任何版本的 cURL;这包括 Cygwin 中的 cURL 和虚拟机中 Ubuntu 上的 cURL,以及 Windows 版本。

什么可能导致这种行为?

【问题讨论】:

  • 是否有可能是内部站点正在使用 SNI,而您访问的站点的证书已过期?或者证书的签名者之一已过期?
  • 我不这么认为。在其他机器上运行完全相同的命令可以正常工作,并且其他人的 cURL 可以很好地连接到服务器。我真的很困惑是什么原因造成的。
  • 抱歉,您查看本地时钟了吗?
  • @RemiGacogne 我确实在主机和虚拟机中检查了本地时钟。两者都是准确的。这是截图:i.imgur.com/t2Yz6fH.png

标签: ssl curl openssl


【解决方案1】:

肮脏而快速的解决方案,对我有用:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

它会禁用 SSL 验证,当然会牺牲安全性。

【讨论】:

    【解决方案2】:

    我的 curl 正在使用存储在以下位置的证书包:

    /etc/ssl/certs/ca-certificates.crt

    我过去遇到过这个问题,我通过查看 curl 正在工作的机器并比较这两台机器的 .crt 文件并复制丢失的证书来修复它。

    我又遇到了这个问题,这次我只是通过从较新的机器上复制整个文件来修复它(最近的 Ubuntu 安装——我遇到问题的机器很古老)。

    它奏效了。

    【讨论】:

    • 这似乎不起作用(不再?)。我在 Ubuntu 16 机器上遇到过这个问题,而另一个 Ubuntu 16 正在运行,但是复制文件并告诉 curl 使用它并没有任何帮助。
    【解决方案3】:

    您的证书包可能已过期。

    您可以在http://curl.haxx.se/ca/cacert.pem 处获得由 curl 开发人员维护的一个

    使用它:

    <?
    $ch = curl_init("http://example.com");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
    $response = curl_exec($ch);
    

    【讨论】:

    • 我使用 curl 开发者提供的证书包更新了我的证书包,我什至重新安装了 curl。这两件事都没有解决我遇到的问题。
    猜你喜欢
    • 2021-11-29
    • 2021-11-23
    • 2021-11-22
    • 2020-09-18
    • 2021-11-26
    • 1970-01-01
    • 2018-02-24
    • 2016-09-21
    • 2014-03-13
    相关资源
    最近更新 更多