0

我注意到 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,但服务器提供了一个由您的计算机操作系统不信任的实体颁发的证书。这可能意味着服务器已经生成了自己的安全凭证,谷歌浏览器不能依赖这些凭证来获取身份信息,或者攻击者可能试图拦截您的通信。您无法继续,因为网站运营商已要求提高此域的安全性。

4

3 回答 3

2

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

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

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

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

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

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

于 2012-10-10T10:40:50.450 回答
0

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

因此,您可以做的是,您可以选择完全忽略该错误。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

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

于 2012-10-10T10:13:27.163 回答
-1

您需要为 SSL 添加这两行

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);     
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
于 2012-10-10T10:14:49.157 回答