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

q8l4jmvw  于 2022-11-13  发布在  其他
关注(0)|答案(8)|浏览(529)

我正在测试一个使用curl_exec php函数和CA证书的API,但是出了点问题,我有点迷路了。
我已经在我的apache虚拟主机上配置了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);
bwitn5fc

bwitn5fc1#

您可能正在使用自签名SSL证书,如果设置了CURLOPT_SSL_VERIFYPEER选项,该证书将无法通过。
有两种解决方案:
1.设置有效的SSL证书。
1.在Curl中禁用SSL验证。(add --insecure option
如果你禁用验证,你就不能确定你是否真的在和你的主机通信。所以这取决于你需要的安全级别。

wkyowqbh

wkyowqbh2#

CURLOPT_SSL_VERIFYPEER外,还有两个其他设置可更改为false/0

CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS

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

mzaanser

mzaanser3#

虽然我是在回答一个老帖子,但我认为它会帮助新观众-
您可以通过添加以下内容来检查问题

$opts[CURLOPT_VERBOSE] = 1

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

u91tlkcl

u91tlkcl4#

如果您担心中间人攻击,那么启用SSL_VERIFYPEER是正确的。
您的$path是否设置为指向API所有者提供的证书(或证书包)?该证书是否可由Web服务器用户读取?如果是,您是否已验证该证书与您在浏览器中手动访问https地址并检查证书时的证书相同?
如果您无法让它工作,并且您连接到的API具有在正常浏览器中工作且没有警告的SSL证书,则您应该能够将$path设置为服务器上的CA根捆绑包。

oprakyz7

oprakyz75#

您可以构建有效的SSL证书,并确保将其存储在受信任的文件夹中。
通过在VS2012的开发者命令提示符中包含以下命令,可以创建有效的SSL证书。(这可以通过在start中键入developer来获得)
以下命令将创建自签名证书,该证书可用于测试使用安全套接字层的Web应用程序URL为www.example.com的Web服务器上的(SSL)。-eku选项定义的OID将该证书标识为SSL server certificate。该证书存储在我的存储中,可在计算机上使用证书的私钥是可导出的,并且证书从May 10, 2010 through December 22, 2011开始有效。
微软www.example.comRSA渠道加密提供程序
有关如何创建SSL certificate的详细信息,请参阅
现在,请确保此证书是可信的,这可以通过在cmd中键入CERTMGR来完成。
现在,创建的证书位于“个人”文件夹中。将其复制并粘贴到“受信任的人”文件夹。
这个应该可以了。如果不行就告诉我。

wnrlj8wa

wnrlj8wa6#

我也有同样的问题。我按照这里的说明: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服务器:
域名服务8.8.8.8器域名服务8.8.4.4

yhived7q

yhived7q7#

如果您在具有自签名证书的linux服务器上更新软件包,也会发生此错误。
解决方案:停止你现有的Apache/nginx服务器。运行certbot(如果你使用的是lets encrypt)
重新启动Apache/nginx服务器。
注意:如果您使用的是Springboot,请添加System.setProperty(“https.protocols”,“TLSv 1,TLSv1.1,TLSv1.2,TLSv1.3”);到您的application.properties文件
瞧!

wpcxdonn

wpcxdonn8#

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

相关问题