2009-02-06 51 views
33

我正尝试使用php和curl库下载安全(使用https)网页的内容。使用CURL读取SSL页面(php)

但是,读取失败,并且出现错误60:“SSL证书问题,请验证CA证书是否正常。”

还 “详细信息:SSL3_GET_SERVER_CERTIFICATE:证书验证失败”

所以...非常自我解释错误味精的。

我的问题是:如何发送SSL证书(正确的?)并获取此页来验证它并让我进入?

而且,这里是我的选择数组中如果你想知道:

$options = array(
     CURLOPT_RETURNTRANSFER => true,  // return web page 
     CURLOPT_HEADER   => false, // don't return headers 
     CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
     CURLOPT_ENCODING  => "",  // handle all encodings 
     CURLOPT_USERAGENT  => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x", // who am i 
     CURLOPT_AUTOREFERER => true,  // set referer on redirect 
     CURLOPT_CONNECTTIMEOUT => 120,  // timeout on connect 
     CURLOPT_TIMEOUT  => 120,  // timeout on response 
     CURLOPT_MAXREDIRS  => 10,  // stop after 10 redirects 
     CURLOPT_SSL_VERIFYHOST => 1, 
    ); 

任何建议将是巨大的, 安德鲁

+0

想想[本条](http://curl.haxx.se/docs/sslcerts。 HTML)是你需要的。 – Sergii 2009-02-06 18:05:51

回答

48

这听起来像你可能会被误解的错误。它看起来像我连接到的网站是自签名或一些其他常见问题。就像通常的浏览器警告一样,最简单的解决方法是禁用检查。

您需要将CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOST设置为FALSE。这应该禁用两个主要检查。他们可能都不是必需的,但这至少应该让你去。

要清楚,这将禁用旨在保护您的功能。只有在通过其他方式验证了证书和服务器的情况下才能执行此操作。

在PHP网站更多信息:curl_setopt()

+0

亚,...我之前阅读过这篇文章,但是将这两个值设置为false对我来说没有任何意义......我想我不知道发生了什么。然而,它的工作完美。所以谢谢:) – Andrew 2009-02-06 18:14:07

+0

这节省了我几个小时的工作!谢谢 ! – liveandream 2012-12-30 08:59:34

+13

不要这样做。它是INSECURE。相反:http://docforge.com/wiki/PHP/Curl – 2013-09-18 15:16:26

0

你不发送的SSL证书。 SSL证书出现问题,因为它安装在您要联系的主机上。使用选项-k或--insecure来越过投诉。

啊。请参阅Ryan Graham的回答

21

如果你想使用SSL对等认证(关闭它并不总是好主意),你可以使用在Windows下一个解决方案在全球范围的所有应用程序:

  1. 下载文件,根证书从这里: http://curl.haxx.se/docs/caextract.html
  2. 添加到php。INI:

curl.cainfo=C:/path/to/cacert.pem

这是所有魔法,袅袅现在可以验证证书。

(因为我知道有在Linux上没有这样的问题,至少在Ubuntu)

6

即使在SO以下意见后..您可能仍然有这样一个错误的问题:

error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error 

问题与SSL的版本。对版本3使用以下内容

curl_setopt($ch, CURLOPT_SSLVERSION,3) 

我假设您已启用对等和主机的验证,并指向实际的证书文件。例如。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/cacert.pem"); 
0

这显然是在openssl的bug。 Tomcat的配置可以通过限制可用的密码列表来解决这/etc/tomcat7/server.xml:

<Connector protocol="HTTP/1.1" SSLEnabled="true" ... ciphers="SSL_RSA_WITH_RC4_128_SHA"/>