【问题标题】:CURL Request crashes SSLCURL 请求使 SSL 崩溃
【发布时间】:2012-10-10 10:04:52
【问题描述】:

我注意到 PHP 中的 CURL 存在一个小问题。每当我请求https:// 连接时,它都会返回“false”,并且我在打开 PHP 页面时尝试访问的每个网站都报告有一个不受信任的证书。

这是我的请求方法:

private function request($url, $params, $method = "GET") {
        if ($method == "GET")
            $url = $this->structGET($url, $params);
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if (isset($_SERVER['HTTP_USER_AGENT'])) {
            curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        } else {
            curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.X.Y.Z Safari/525.13.');
        }
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);

        $header[] = 'Accept-Language: EN';
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            curl_setopt($ch, CURLOPT_POST, true);
            if ($params)
                curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        }
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

这就是我尝试访问 Facebook 时 Chrome 返回的内容。

网站的安全证书不受信任!

您试图到达 www.facebook.com,但服务器提供了一个由 不受计算机操作系统信任的实体。这 可能意味着服务器已经生成了自己的安全凭证, 谷歌浏览器不能依赖的身份信息,或者 攻击者可能试图拦截您的通信。你不能 继续,因为网站运营商要求提高安全性 对于这个域。

【问题讨论】:

  • "[...] 我在打开 PHP 页面时尝试访问的每个网站都报告有一个不受信任的证书"。您能否澄清一下,您访问自己的页面这一事实与您直接使用浏览器访问 Facebook 时获得的结果有什么关系?其他浏览器,其他机器会发生什么?您管理自己的机器吗?您在公司网络上吗?
  • 每个使用 https://* 的网站在每个 SSL 网站的每个浏览器中都会出现相同的错误。
  • 只在你的机器上?您在公司网络上吗?那个网络上的其他机器呢?
  • 只有在我的机器上,服务器是本地的。
  • 我猜它没有像那个网络上的其他机器一样集中安装?

标签: php ssl curl


【解决方案1】:

不要使用禁用证书验证的技术。虽然他们可能在表面上“解决”您的问题,但他们只是忽略了问题,而不是解决问题。永远不要在生产代码中这样做。

最可能的原因是您所在的网络有 MITM 公司代理。无论这些设备多么合法,它们实际上都是 MITM 设备。

他们所做的是将原始证书替换为使用自己的内部 CA 颁发的证书,以便能够监控流量。

如果此设备由您的网络管理员合法设置,您应该能够获得其 CA 证书(在这种情况下,CA 证书通常会安装在集中管理的所有最终用户计算机上)。

作为开发人员,您很可能已经安装了自己的计算机,但可能没有安装 CA 证书。向您的网络管理员询问该 CA 证书,并使用浏览器使用的证书和 PHP 中的 curl(两个不同位置)安装它。 curl 默认位置可能取决于您使用的系统,但您也可以通过CURLOPT_CAINFO 进行配置。

假设您正在本地网络中进行开发,但完成后可能会将该服务部署到不同的网络上。确保这是可配置的。

【讨论】:

  • 使用代理怎么样?我使用 ssh 隧道从我的局域网访问 facebook,否则证书无效。因此,我建议使用代理进行适当的修复。您应该将其添加到您的答案中以使其更完整。顺便说一句,我完全同意你所说的。
  • @goldenparrot,确保 SSH 隧道可以工作,但这只是一个漏洞,与通常使用 MITM SSL 代理服务器的严格安全策略不太一致。
【解决方案2】:

是的,当 cURL 尝试查看 SSL 是否经过验证时会发生这种情况。 Facebook 通常有一个经过验证的签名,但可能是因为网络,它返回无效(在我的情况下发生:使用 fortiguard 代理,facebook 被阻止!)

所以,你可以做的是,你可以选择完全忽略这个错误。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

这应该可以解决它。但是,如果您想正确修复它,那么您可能应该使用代理或其他东西或获取服务器的证书(如果它是您的)。

【讨论】:

  • 禁用证书验证会引入 MITM 攻击漏洞,这与 Facebook 等服务尝试强制使用 HTTPS 的原因恰恰相反。
  • @Bruno 嘿嘿,但是如果没有验证ssl,那就是网络存在问题。没有人可以FIX 对吗? OP 会知道问题出在哪里(如果他理解 chrome 所说的话),因此他别无选择,只能更改他的网络或进行权衡并且无需验证即可工作。我认为 -1 不公平,因为我提到这不是正确的解决方法!
  • 这解决了问题。好像也是网络问题。它在我的家庭网络上运行良好。
  • @goldenparrot,忽略潜在的 MITM 绝不是一个好主意。如果它是合法的 MITM 代理,请将其 CA 证书添加到您的受信任列表中。不要开发忽略验证的代码。
【解决方案3】:

你需要为 SSL 添加这两行

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);     
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 

【讨论】:

  • 禁用证书验证会引入 MITM 攻击漏洞,这与 Facebook 等服务尝试强制使用 HTTPS 的原因恰恰相反。
  • @Bruno 来自他的问题“该站点的安全证书不受信任!”他需要做卷曲请求
  • 因此,您对“我无法信任您的身份”的解决方案是“让我们忽略我一开始就试图验证您的身份这一事实”...
  • 我认为没有其他解决方案,如果证书不受信任。
猜你喜欢
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2023-03-17
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多