我们的网站最近从http转为https.它有我们客户调用的REST API调用,现在不能正常工作:
SSL之前的cURL(工作):
$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);
Run Code Online (Sandbox Code Playgroud)
SSL之后的cURL(不工作):
$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);
Run Code Online (Sandbox Code Playgroud)
除了要求客户端在其REST集成代码上添加CURLOPT_SSL_VERIFYPEER,CURLOPT_SSL_VERIFYHOST,CURLOPT_CAINFO之外,我是否需要在服务器上设置任何内容?
我真的是https的新手,我不知道我需要搜索的术语究竟是什么,搜索cURL SSL已经好几个小时......
顺便说一句,我们的网站正在使用亚马逊ec2托管,如果这些信息很重要...
这是返回的cURL错误:
error:SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Run Code Online (Sandbox Code Playgroud)
cURL版本:7.21.6
SSL版本:OpenSSL/1.0.0e
不要像其他人经常建议的那样关闭对等和主机验证. 对于真正的问题,这是一种快速但不安全的解决方法.这些功能存在的原因很充分:因此您可以通过第三方信任您所连接的系统是您期望的系统.
首先查找您的操作系统是否包含证书目录.通常会包括证书颁发机构.例如,在Ubuntu上,它经常出现在/etc/ssl/certs
.如果此目录存在,请设置CA路径参数:
curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs');
Run Code Online (Sandbox Code Playgroud)
或者,您可以引用单个CA证书文件.在项目中包含cacert.pem文件或将其安装在您的服务器上.从可信来源下载,例如cacert.org.对于单个文件,不要设置CAPATH,而只设置CAINFO:
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
Run Code Online (Sandbox Code Playgroud)
并启用验证:
curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs');
Run Code Online (Sandbox Code Playgroud)