繁体   English   中英

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

[英]SSL peer certificate or SSH remote key was not OK

我正在测试一个使用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”行)并且以这种方式它正在工作,但这只是一个工作...

$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验证。 添加--insecure选项

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

虽然我正在回答旧帖,但我认为这会有助于新观众 -

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

$opts[CURLOPT_VERBOSE] = 1

对于自签名证书,您的客户端可以使用IP地址与服务器连接,因为主机名在DNS缓存中不可用。 在这种情况下,服务器证书的COMMON NAME(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服务器用户读取? 如果是,您是否已验证证书与在浏览器中手动访问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 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

有关如何创建SSL证书的更多信息

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

现在创建的证书位于PERSONAL文件夹中..复制并粘贴到TRUSTED PEOPLE FOLDER。

这应该可以解决问题。 如果这不起作用,请告诉我。

我遇到过同样的问题。 我按照这里的说明操作: 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

如果更新具有自签名证书在Linux服务器上的包,也会出现此错误。

解决方案:停止你现有的Apache / nginx的服务器。 运行 certbot(如果您使用让加密)

重新启动 Apache/nginx 服务器。

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

瞧!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM