2012-11-20 95 views
4

我们的网站最近从http转向https。它具有REST API调用我们的客户称为这是现在不工作:为SSL配置cURL

卷曲SSL之前(工作):

$ch = curl_init(); 

curl_setopt($ch,CURLOPT_URL,$api_call_url); 
curl_setopt($ch,CURLOPT_POST,1); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_fields); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$result = curl_exec($ch); 

curl_close($ch); 

SSL(不工作)之后卷曲:

$ch = curl_init(); 

curl_setopt($ch,CURLOPT_URL,$api_call_url); 
curl_setopt($ch,CURLOPT_POST,1); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_fields); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_CAINFO, "/customers_path_on_their_server/to/our_cacert_they_exported_via_firefox.crt"); //X.509 Certificate 

$result = curl_exec($ch); 

curl_close($ch); 

我是否除了要求客户端在其REST集成代码中添加CURLOPT_SSL_VERIFYPEER,CURLOPT_SSL_VERIFYHOST,CURLOPT_CAINFO之外,还需要在我们的服务器上设置任何东西?

我真的在HTTPS一个新手,我不知道究竟是我需要搜索术语,搜索卷曲SSL对已经小时...

顺便说一句,我们的网站使用托管在Amazon EC2如果这些信息是非常重要的......

这里是返回的卷曲的错误:

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

卷曲版本:7.21.6

SSL版本:OpenSSL的/ 1.0.0e

+1

http://stackoverflow.com/questions/6400300/php-curl-https -causing-exception-ssl-certificate-problem-verify-that-c​​a-cer – nkamm

+0

@nkamm它仍然不起作用。我检查了从我们的客户服务器中存储的Firefox导出的.crt文件是否与我们服务器的.crt文件相同。他们是一样的。我们的服务器的.crt文件位于/etc/apache2/ssl/our_site.crt。你认为我应该把它移到其他地方吗?我已经计算了超过5个小时已经.... OH MY ... – Woppi

+0

也请他们在选择(在Firefox中)使用第二个选项导出证书http://i.stack.imgur.com/ kZpCQ.png – nkamm

回答

0

您需要设置CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST到faslse或0

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

ASLO你需要确保玉置CURLOPT_URL到的“https:// ...”

卡尔

+2

这是不安全的。不要这样做。 –

+0

将这些选项中的任何一个设置为false,完全违背了使用SSL(https)进行安全数据传输的目的。如果对方或主机未经验证,则可能是任何服务器,这会消除针对“中间人”攻击的保护。这意味着它与SSL根本不使用时一样不安全。 – BazzyTK

5

不要关闭同行和主机验证为别人常提示。这是一个快速但不安全的解决方法。这些功能的存在是有原因的:所以您可以通过第三方相信您连接的系统是您期望的系统。

首先查找您的操作系统是否包含证书目录。证书颁发机构通常会包含在内。例如,在Ubuntu上,它通常在/etc/ssl/certs。如果此目录存在,请设置CA路径参数:

curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs'); 

或者,您可以引用单个CA证书文件。在您的项目中包含一个cacert.pem文件或将其安装在您的服务器上。从可信来源下载,例如cacert.org。对于单个文件不设置CAPATH,而是只设置CAINFO:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'); 

,并开启验证:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
+0

verifyhost的正确值是2,而不是1:http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html。但同行和主机验证是我的默认,所以你不需要提供。 – hadley