CURL请求崩溃了SSL

时间:2012-10-10 10:04:52

标签: php ssl curl

我注意到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时返回的内容。

  

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

     

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

3 个答案:

答案 0 :(得分:2)

请勿使用禁用证书验证的技术。虽然他们可以解决"表面上你的问题,他们只是忽略了问题,而不是修复它。切勿在生产代码中执行此操作。

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

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

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

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

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

答案 1 :(得分:0)

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

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

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

答案 2 :(得分:-1)

您需要为SSL添加这两行

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