我正在测试一个使用curl_exec
php函数和CA证书的API,但是出了点问题,我有点迷失了。
我在我的apache VirtualHost上配置了SSL并且看起来没问题(打开https:://[myVHost]
...工作)。
然而,API curl调用会给我回复此消息:
SSL peer certificate or SSH remote key was not OK
我对SSL不是很熟悉,所以我对其原因几乎一无所知。
更新
这是我在我的cURL请求中使用的代码,我已经评论了2行并更改了它们的值(看看'TODO'行)并且这样它正在工作,但这只是一个工作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);
答案 0 :(得分:4)
您可能正在使用自签名SSL证书,当设置了CURLOPT_SSL_VERIFYPEER选项时,它不会通过。
有两种解决方案:
如果禁用验证,则无法确定是否确实在与主机通信。 所以这取决于你需要的安全级别。
答案 1 :(得分:2)
虽然我正在回答一个旧帖子,但我认为这会有助于新观众 -
您可以通过添加
来检查问题$opts[CURLOPT_VERBOSE] = 1
对于自签名证书,您的客户端可以使用IP地址与服务器连接,因为主机名在DNS缓存中不可用。在这种情况下,服务器证书的COMMON NAME(CN)需要与服务器IP匹配(在生成服务器证书时将IP地址作为通用名称)。正确执行此操作后,您可以看到以下消息:
通用名称:192.168.0.1(匹配)
这里以192.168.0.1为例。
答案 2 :(得分:1)
除CURLOPT_SSL_VERIFYPEER
旁边还有其他两个设置可能会更改为false
/ 0
:
CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS
请注意您应该修复您的SSL证书&设置而不是禁用安全性!
答案 3 :(得分:0)
如果你担心中间人攻击,你想要启用SSL_VERIFYPEER
是正确的。
您的$path
是否设置为指向API所有者提供的证书(或证书包)?该证书是否可由Web服务器用户读取?如果是,您是否确认证书与在浏览器中手动访问https地址并检查证书时相同?
如果您无法使其运行,并且您要连接的API具有可在普通浏览器中正常运行的SSL证书而无需警告,则应该能够将$path
设置为您的CA根目录捆绑在您的服务器上。
答案 4 :(得分:0)
您可以构建有效的SSL证书,并确保它存储在受信任的文件夹中。
可以通过在VS2012
的开发人员命令提示符中包含以下命令来创建有效的SSL证书。 (这可以通过在开始时键入开发人员来获得)
以下命令创建一个自签名证书,该证书可用于测试在URL为www.example.com
的Web服务器上使用安全套接字层(SSL)的Web应用程序。 -eku
选项定义的OID将该证书标识为SSL server certificate
。证书存储在我的商店中,可在机器(而不是用户)级别使用。证书的私钥是可导出的,证书从May 10, 2010 through December 22, 2011
开始有效。
Makecert -r -pe -n CN =" www.example.com" -b 05/10/2010 -e 12/22/2011 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp" Microsoft RSA SChannel Cryptographic Provider" -sy 12
有关如何创建SSL certificate
的详情现在确保此证书可信,可以通过在cmd中键入CERTMGR
来完成此操作。
现在创建的证书位于PERSONAL文件夹中..复制并粘贴到TRUSTED PEOPLE FOLDER。
这应该可以解决问题。如果这不起作用,请告诉我。
答案 5 :(得分:0)
我有同样的问题。我遵循这里的指示: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
使用
Google的公共DNS服务器:
nameserver 8.8.8.8 nameserver 8.8.4.4
答案 6 :(得分:0)
如果您在具有自签名证书的 linux 服务器上更新包,也会发生此错误。
解决办法: 停止您现有的 Apache/nginx 服务器。 运行 certbot(如果您使用让加密)
重启你的 Apache/nginx 服务器。
注意:如果您使用的是 Springboot,请添加 System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");到您的 application.properties 文件
瞧!