SSL对等证书或SSH远程密钥不正常


SSL peer certificate or SSH remote key was not OK

我正在测试一个使用curl_exec php函数和CA证书的API,但出现了一些问题,我有点不知所措。

我已经在我的apacheVirtualHost上配置了SSL,看起来还可以(打开https:://[myVHost]…工作(。

然而,API curl调用返回了以下消息:

  • SSL peer certificate or SSH remote key was not OK

我对SSL不是很有经验,所以我对造成这种情况的原因没有什么想法。

更新:

这是我在cURL请求中使用的代码,我已经注释了2行并更改了它们的值(查看"TODO"行(,以这种方式它正在工作,但这只是一个工作区域。。。

$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证书,当设置CURLOPT_SSL_VERIFYPEER选项时,该证书将不会通过。

有两种解决方案:

  1. 设置有效的SSL证书
  2. 在Curl中禁用SSL验证。(add--不安全选项(

如果禁用验证,则无法确定您是否真的在与主机通信。所以这取决于您需要的安全级别。

除了CURLOPT_SSL_VERIFYPEER之外,还有两个其他设置可能会更改为false/0

CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS

请注意,您应该修复SSL证书&设置而不是禁用安全!

虽然我在回复一篇旧帖子,但我认为它会帮助新的观众-

您可以通过添加来检查问题

$opts[CURLOPT_VERBOSE] = 1

对于自签名证书,您的客户端可以使用IP地址与服务器连接,因为主机名在DNS缓存中不可用。在这种情况下,服务器证书的通用名称(CN(需要与服务器IP匹配(生成服务器证书时将IP地址作为通用名称(。如果操作正确,您可以看到以下消息:

通用名称:192.168.0.1(匹配(

这里192.168.0.1是一个例子。

如果您担心中间人攻击,那么启用SSL_VERIFYPEER是正确的。

您的$path是否设置为指向API所有者提供的证书(或证书捆绑包(?web服务器用户可读该证书吗?如果是,您是否验证了证书与您在浏览器中手动访问https地址并检查证书时的证书相同?

如果您无法使其工作,并且您连接到的API具有在正常浏览器中工作而没有警告的SSL证书,则您应该能够将$path设置为服务器上的CA根捆绑包。

您可以构建一个有效的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 2010年10月5日-e 2011年12月22日-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证书的更多信息

现在,请确保该证书是可信的,这可以通过在cmd中键入CERTMGR来完成。。

现在创建的证书在PERSONAL文件夹中。。复制并粘贴到"信任的人"文件夹中。

这应该奏效。如果不起作用,请告诉我。

我也遇到了同样的问题。我遵循这里的指示: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.8nameserver 8.8.4.4

如果在具有自签名证书的linux服务器上更新包,也可能发生此错误。

解决方案:停止现有的Apache/nginx服务器。运行certbot(如果您正在使用letsencrypt(

重新启动Apache/nginx服务器。

注意:如果您使用的是Springboot,请添加System.setProperty("https.procols"、"TLSv1、TLSv1.1、TLSv1.2、TLSv1.3"(;到您的application.properties文件

哇!

我几乎花了一整天的时间来处理这个错误,问题是在使用ipv6时,并且调用的api服务器不支持ipv6。解决方案:curl_setopt($ch,CURLOPT_IPRESOLVE,curl_VERSION_IPV4(