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

Posted

技术标签:

【中文标题】SSL 对等证书或 SSH 远程密钥不正确【英文标题】:SSL peer certificate or SSH remote key was not OK 【发布时间】:2012-12-20 23:57:57 【问题描述】:

我正在测试一个使用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);

【问题讨论】:

我们需要您用来发出请求的完整且完整的代码,包括 所有 正在设置的 curl 选项。另外,这是自签名证书吗? 已添加信息 :) 关于 self-signed certificate 我不知道的问题:证书随 API ... 您已成功确定根本原因:CURLOPT_SSL_VERIFYHOST 为 2。当设置为 2 时,curl 将验证证书是否有效,并且它是由它信任的 CA 颁发的。如果远程证书是自签名的,或者不是由它信任的 CA 颁发的,它会抱怨并给出一个错误,就像你得到的那样。如果您从第三方获得证书,则需要说服 curl 信任签署它的 CA。您说您获得了 CA 证书,对吗?你用它做了什么? 我有 ca-certs.crt API 提供的文件,我只是使用文档中描述的所有内容... 【参考方案1】:

您可能正在使用自签名 SSL 证书,当设置 CURLOPT_SSL_VERIFYPEER 选项时,该证书不会通过。

有两种解决方案:

    购买有效的 SSL 证书。 在 Curl 中禁用 SSL 验证。 (add --insecure option)

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

【讨论】:

【参考方案2】:

除了CURLOPT_SSL_VERIFYPEER之外,还有另外两个设置可以改成false/0

CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS

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

【讨论】:

【参考方案3】:

虽然我是在回答一个旧帖子,但我认为它会对新观众有所帮助-

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

$opts[CURLOPT_VERBOSE] = 1

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

通用名:192.168.0.1(匹配)

这里 192.168.0.1 是一个例子。

【讨论】:

【参考方案4】:

如果您担心中间人攻击,您想启用SSL_VERIFYPEER 是对的。

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

如果你不能让它工作,并且你连接的 API 有一个 SSL 证书,可以在你的普通浏览器中工作而没有警告,你应该能够将 $path 设置为你服务器上的 CA 根包.

【讨论】:

【参考方案5】:

您可以构建有效的 SSL 证书并确保它存储在受信任的文件夹中。

可以通过在VS2012 的开发人员命令提示符中包含以下命令来创建有效的 SSL 证书。 (这可以通过在开头输入developer来获得)

以下命令创建一个自签名证书,可用于在 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 文件夹中。

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

重启你的 Apache/nginx 服务器。

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

瞧!

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于SSL 对等证书或 SSH 远程密钥不正确的主要内容,如果未能解决你的问题,请参考以下文章

在IDEA中通过密钥认证的方式使用SSH连接远程Linux服务器

将证书添加到ssh-agent以获取已在代理中的密钥

使用ssh连接远程主机

vs code远程连接主机

如何使用 Python 通过 SSL 连接到远程 PostgreSQL 数据库

Android SSL HttpGet(无对等证书)错误或(对等连接已关闭)错误