不是黑客攻击:Curl异常60(cURL SSL证书验证)

8

很多人在使用Facebook身份验证时会遇到以下错误:

CurlException: 60: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

根据我找到的唯一信息,建议在curl中添加以下代码行:

$opts[CURLOPT_SSL_VERIFYPEER] = false;
$opts[CURLOPT_SSL_VERIFYHOST] = 2;

我知道这个可以工作,但是这里发生了什么事情? 难道没有可以更改的服务器设置/配置,而不是篡改facebook.php文件吗?

这里正在验证谁的证书? - Pekka
3个回答

17

功能及含义:

以下代码告诉cURL不验证安全证书是否正确。因此,该错误将消失。

  $opts[CURLOPT_SSL_VERIFYPEER] = false;
  $opts[CURLOPT_SSL_VERIFYHOST] = 2;

当您使用SSL连接到远程服务器时,他们的证书可能无效、过期或未由认可的CA签名。cURL通常会检查它。
CURLOPT_SSL_VERIFYHOST:
1:检查SSL对等证书中是否存在公共名称。
2:检查公共名称的存在,并验证其是否与提供的主机名匹配。
CURLOPT_SSL_VERIFYPEER:FALSE以停止CURL验证对等方的证书。可以使用CURLOPT_CAINFO选项指定要验证的备用证书,也可以使用CURLOPT_CAPATH选项指定证书目录。如果禁用CURLOPT_SSL_VERIFYPEER,则CURLOPT_SSL_VERIFYHOST可能需要设置为TRUE或FALSE(默认为2)。

如何启用并正确验证:

为了正确验证,我们需要确认向我们呈现的证书是真实有效的。我们通过将其与我们合理信任的证书进行比较来完成此操作。

如果远程资源受到由主要CA(如Verisign、GeoTrust等)发行的证书的保护,则可以安全地与Mozilla的CA证书包进行比较,您可以从http://curl.haxx.se/docs/caextract.html获取。

将cacert.pem文件保存在服务器上的某个位置,并在脚本中设置以下选项。

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

如果您正在连接到由自签名证书保护的资源,则需要获取PEM格式的证书副本并将其附加到上面段落中的cacert.pem文件。

我认为他的主要问题是如何规避这种黑客攻击。 - Pekka
那么这个问题只在我的一个服务器上发生而不是其他的原因是什么? - John
@John,其他服务器都有内置的安全证书,不需要手动指定证书。就像IE/Firefox浏览器内置了证书,不需要您每次连接到类似GMAil、HoTMaiL这样的安全登录网站时提供证书文件。 - shamittomar
变量 $ch 定义在哪里? - Phil
在facebook.php文件中。谢谢Shamit! - Phil
啊!我一直在寻找关于在nuSOAP中使用自签名证书的相关信息。 - salmonmoose

2

在我的情况下,我无法使用curl_setopt,因为我无法编辑Facebook API类(我所工作的项目的条件)。

我通过将从http://curl.haxx.se/docs/caextract.html下载的cacert.pem路径添加到我的php.ini中来解决问题。

[curl]
curl.cainfo = "c:\wamp\cacert.pem"

0

我之前也遇到了同样的问题,但是在我这个情况下禁用对等验证是不可接受的。 我更新了fa_ca_chain_bundle.crt文件(来自Facebook的Github),现在它可以正常工作了。

祝好, Marek


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接