用CURL(php)读取SSL页面

时间:2009-02-06 18:03:03

标签: php ssl curl

我正在尝试使用php和curl库下载安全(使用https)网页的内容。

但是,读取失败,我收到错误60:“SSL证书问题,请验证CA证书是否正常。”

还“详情:SSL3_GET_SERVER_CERTIFICATE:证书验证失败”

所以...非常自我解释的错误msg's。

我的问题是:如何发送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,
    );

任何建议都会很棒, 安德鲁

7 个答案:

答案 0 :(得分:49)

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

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

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

PHP网站上的更多信息:curl_setopt()

答案 1 :(得分:21)

如果您想使用SSL对等验证(关闭并不总是好主意),您可以在Windows上为所有应用程序使用下一个解决方案:

  1. 从此处下载带有根证书的文件: http://curl.haxx.se/docs/caextract.html
  2. 添加到php.ini:
  3. curl.cainfo=C:/path/to/cacert.pem

    这一切都很神奇,CURL现在可以验证证书了。

    (据我所知,Linux上没有这样的问题,至少在Ubuntu上是这样的)

答案 2 :(得分: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");

答案 3 :(得分:2)

这是openssl和VeriSign的“问题”。

我遇到了类似的问题,我的openssl错过了VeriSign用来签署服务器证书的中间ssl证书。

https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR657

我必须将这些中间证书从VeriSign主页或Firefox cert-database-export导入到我的本地ca-certificates列表中,在此步骤之后我能够使用wget / curl来使用受保护的连接而没有任何错误。< / p>

答案 4 :(得分:1)

如果是开发人员计算机 - 您也可以在系统中添加此证书。 这样的事情 - https://www.globalsign.com/support/intermediate/intermediate_windows.php 它适用于WinXP,但它也适用于其他版本的Windows。

答案 5 :(得分:0)

您没有发送SSL证书。 SSL证书似乎存在问题,因为它安装在您正在联系的主机上。使用选项-k或--insecure来完成投诉。

阿。请参阅Ryan Graham的回答

答案 6 :(得分:0)

这显然是关于openssl的bug。通过限制可用的密码列表,可以将Tomcat配置为在/etc/tomcat7/server.xml中解决此问题:

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