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服务器