I'm testing an API that uses curl_exec
php function and a CA certificate but something is going wrong and I'm a little lost.
I have configured SSL on my apache VirtualHost and looks ok ( opening https:://[myVHost]
... works ).
However the API curl call give me back this message:
SSL peer certificate or SSH remote key was not OK
I'm not very experienced with SSL so I have few ideas about the cause of that.
UPDATE:
This is the code I'm using in my cURL request, I have commented 2 lines and changes their value (look at 'TODO' line ) and in this way it is working, however this is just a work arround ...
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_RETURNTRANSFER] = true;
$opts[CURLOPT_CONNECTTIMEOUT] = 50;
$opts[CURLOPT_TIMEOUT] = 100;
$headers = array(
'Accept: application/json',
"User-Agent: APIXXX-PHP-Client");
$opts[CURLOPT_HTTPHEADER] = $headers;
$opts[CURLOPT_USERPWD] = $env->getApiKey() . ':';
if (certificatePresent()) {
// $opts[CURLOPT_SSL_VERIFYPEER] = true;
// $opts[CURLOPT_SSL_VERIFYHOST] = 2;
// TODO: SET IT BACK
$opts[CURLOPT_SSL_VERIFYPEER] = 0;
$opts[CURLOPT_SSL_VERIFYHOST] = 0;
$opts[CURLOPT_CAINFO] = $path
}
curl_setopt_array($curl, $opts);
$response = curl_exec($curl);
您可能正在使用自签名的SSL certifiacate,当CURLOPT_SSL_VERIFYPEER选项设置,将无法通过。
有两个解决方案:
- 购买有效的SSL证书。
- 禁用SSL验证的卷曲。 ( 加--insecure选项 )
如果禁用验证,你不能肯定,如果你真的与你的主机进行通信。 因此,它取决于你所需要的安全级别。
虽然我回答旧的文章,我认为这将有助于新的viewers-
您可以通过添加检查问题
$opts[CURLOPT_VERBOSE] = 1
对于自签名证书的客户端可以使用IP地址的服务器连接,因为主机名不是DNS缓存使用。 在这种情况下,您的服务器证书的通用名称(CN)的需求,以配合服务器IP(把IP地址作为通用名称生成服务器证书时)。 当你这样做是正确,你可以看到这条消息:
共同的名字:192.168.0.1(匹配)
这里192.168.0.1就是一个例子。
除了CURLOPT_SSL_VERIFYPEER
有可能改变为另两个设置false
/ 0
:
CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS
要注意的是,你应该解决您的SSL证书和设置,而不是禁用安全的!
你说得对想使SSL_VERIFYPEER
如果你担心人在这方面的中间人攻击。
是您的$path
设置为指向由API业主提供的证书(或证书捆绑)? 是由证书的Web服务器用户可读? 如果是这样,你验证证书(s)是相同的,当你手动访问HTTPS地址在浏览器中并检查证书?
如果你不能得到它的工作,和你连接到API具有在您的正常浏览器不警告工作的SSL证书,你应该能够设置$path
到您的CA根捆绑您的服务器上。
你可以建立一个有效的SSL证书,并确保其存储在受信任的文件夹中。
有效的SSL证书可以通过包括在显影剂命令提示以下命令创建VS2012
。 (这可以通过键入显影剂在开始时获得的)
下面的命令创建一个可以用来测试Web服务器,其网址是使用安全套接字层(SSL)的Web应用程序中的自签名证书www.example.com
。 由定义的OID -eku
选项标识该证书作为SSL server certificate
。 该证书存储在我的商店,并可在计算机(而非用户)的水平。 该证书的私钥可以导出,且证书有效期从May 10, 2010 through December 22, 2011
。
Makecert -r -pe -n CN = “www.example.com” -b 05/10/2010 -e 2011年12月22日-eku 1.3.6.1.5.5.7.3.1 -ss我-sr LOCALMACHINE -sky交换-SP“微软RSA SChannel加密提供” -sy 12
欲了解更多关于如何创建SSL证书
现在确保这个证书是可信的,这可以通过打字来完成CERTMGR
在cmd ..
现在创建的证书是在个人文件夹..复制并粘贴到信任的人的文件夹。
这应该做的伎俩。 让我知道,如果不工作。
我遇到过同样的问题。 我按照指示在这里: http://siteber.com/download-failed-ssl-peer-certificate-or-ssh-remote-key-was-not-ok/它固定我的。
基本上我去/etc/resolv.conf中
并更换
OpenDNS的服务器:
208.67.222.222
208.67.220.220
同
谷歌的公共DNS服务器:
域名服务器8.8.8.8 8.8.4.4域名服务器