【问题标题】:reading SSL page with CURL (php) [duplicate]使用 CURL (php) 读取 SSL 页面 [重复]
【发布时间】:2010-10-06 00:07:20
【问题描述】:

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

但是,读取失败,我收到错误 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,
    );

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

【问题讨论】:

标签: php ssl curl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    明确地说,这会禁用旨在保护您的功能。仅当您通过其他方式验证了证书和服务器时才执行此操作。

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

    【讨论】:

    • 是的,...我之前读过那篇文章,....但是将这两个值都设置为 false 对我来说真的没有意义...我想我真的不知道发生了什么在。但是它工作得很好。所以谢谢:)
    • @MattS 当然是!我将编辑答案以使其更加明显。
    • 这没有解决任何问题。这是@Ryan 的危险行为,你真的应该停止教人们这个。 SSL 的存在是有原因的。不验证证书正在破坏拥有 SSL 的意义。确保您了解为什么会发生此错误。不是你如何让它消失。
    • @Ruben 如果您觉得现有的 bold 免责声明不够充分,请随时编辑答案。
    【解决方案3】:

    即使遵循了关于 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");
    

    【讨论】:

      【解决方案4】:

      如果它是开发者机器 - 您也可以在您的系统中添加此证书。 像这样的东西 - https://www.globalsign.com/support/intermediate/intermediate_windows.php 它适用于 WinXP,但也适用于其他版本的 windows。

      【讨论】:

      • 以上链接失效;重定向到 globalsign.com 主页。
      【解决方案5】:

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

      1. 从这里下载带有根证书的文件: http://curl.haxx.se/docs/caextract.html
      2. 添加到 php.ini:

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

      太神奇了,CURL 现在可以验证证书了。

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

      【讨论】:

      • 做到了!我在 Centos 6 上遇到了这个问题......所以似乎并非所有发行版都免疫:)
      【解决方案6】:

      这是 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 来使用受保护的连接而不会出现任何错误。

      【解决方案7】:

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

      啊。查看 Ryan Graham 的回答

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-22
        • 1970-01-01
        • 2011-05-30
        • 2017-11-18
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多