Php SSL对等证书或SSH远程密钥不正常
我正在测试一个使用Php SSL对等证书或SSH远程密钥不正常,php,apache,ssl,curl,Php,Apache,Ssl,Curl,我正在测试一个使用curl\u execphp函数和CA证书的API,但是出了点问题,我有点不知所措 我已经在apache VirtualHost上配置了SSL,看起来还可以(打开https::://[myVHost]…工作) 但是,API curl调用返回了以下消息: SSL对等证书或SSH远程密钥不正常 我对SSL不是很有经验,所以我对造成这种情况的原因没有什么想法 更新: 这是我在cURL请求中使用的代码,我已经注释了2行并更改了它们的值(查看“TODO”行),这样它就可以工作了,但是
curl\u exec
php函数和CA证书的API,但是出了点问题,我有点不知所措
我已经在apache VirtualHost上配置了SSL,看起来还可以(打开https::://[myVHost]
…工作)
但是,API curl调用返回了以下消息:
SSL对等证书或SSH远程密钥不正常
$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 Certificate,当设置CURLOPT_SSL_VERIFYPEER选项时,它将不会通过 有两种解决方案:
因此,这取决于您需要的安全级别。如果您担心中间人攻击,那么启用
SSL\u VERIFYPEER
是正确的
您的$path
是否设置为指向API所有者提供的证书(或证书包)?web服务器用户是否可以读取该证书?如果是,您是否已验证证书与在浏览器中手动访问https地址并检查证书时的证书相同
如果您无法使其正常工作,并且您连接的API有一个SSL证书,该证书在您的正常浏览器中工作而没有警告,则您应该能够将
$path
设置到服务器上的CA根捆绑包。您可以生成有效的SSL证书,并确保它存储在受信任的文件夹中
可以通过在VS2012
的开发者命令提示符中包含以下命令来创建有效的SSL证书。(这可以通过在开始处键入developer获得)
以下命令创建一个自签名证书,可用于测试在URL为www.example.com
的web服务器上使用安全套接字层(SSL)的web应用程序。-eku
选项定义的OID将该证书标识为SSL服务器证书
。证书存储在my store中,在计算机(而不是用户)级别可用。证书的私钥是可导出的,证书的有效期为2010年5月10日至2011年12月22日
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加密提供商”-sy 12
有关如何创建
现在,请确保此证书受信任,可以通过在cmd中键入CERTMGR
来完成此操作
现在创建的证书位于个人文件夹中。。将其复制并粘贴到受信任的人员文件夹
这应该能奏效。如果不行,请告诉我 我也有同样的问题。我遵循这里的指示:它解决了我的问题 基本上我去了/etc/resolv.conf 并替换任何 OpenDNS服务器: 208.67.222.222 208.67.220.220 与 谷歌的公共DNS服务器: 名称服务器8.8.8.8
nameserver8.8.4.4虽然我在回复一篇老文章,但我认为它会帮助新的观众- 您可以通过添加
$opts[CURLOPT_VERBOSE] = 1
对于自签名证书,您的客户端可以使用IP地址与服务器连接,因为主机名在DNS缓存中不可用。在这种情况下,服务器证书的公共名称(CN)需要与服务器IP匹配(在生成服务器证书时将IP地址作为公共名称)。正确操作后,您可以看到以下消息:
通用名称:192.168.0.1(匹配)
这里192.168.0.1是一个例子。除了
CURLOPT\u SSL\u VERIFYPEER
之外,还有两个其他设置可能被更改为false
/0
:
CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS
请注意,您应该修复SSL证书和设置,而不是禁用安全性 我们需要您用来发出请求的完整代码,包括所有设置的curl选项。另外,这是一个自签名证书吗?信息添加:)关于自签名证书的问题我不知道:证书是随API提供的…您已成功确定根本原因:
CURLOPT\u SSL\u VERIFYHOST
为2。当设置为2时,curl将验证证书是否有效,以及证书是否由其信任的CA颁发。如果远程证书是自签名的,或者不是由它信任的CA颁发的,它将发出呜呜声,并给出一个与您收到的错误类似的错误。如果您从第三方获得证书,则需要说服curl信任签署证书的CA。你说你拿到了CA证书,对吗?你用它做了什么?我有API提供的ca certs.crt
文件,我只是在使用文档中描述的一切。。。