我正在尝试通过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版本。
什么可能导致这种行为?
答案 0 :(得分:1)
您的证书包可能已过期。
您可以在http://curl.haxx.se/ca/cacert.pem
处获得由卷曲开发人员维护的内容使用它:
<?
$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);
答案 1 :(得分:1)
我的curl正在使用存储在以下位置的证书包:
/etc/ssl/certs/ca-certificates.crt
我以前遇到过这个问题,我通过查看curl工作的机器并比较这两台机器上的.crt文件,然后复制丢失的证书来修复它。
我刚刚又遇到了这个问题,我这次修复它只是从新机器上复制整个文件(更新的Ubuntu安装----我遇到问题的机器很古老)。
它有效。
答案 2 :(得分:0)
肮脏又快速的解决方案对我有用:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
它会禁用SSL验证,当然会牺牲安全性。