29

我正在测试一个使用curl_execphp 函数和 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);
4

8 回答 8

17

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

有两种解决方案:

  1. 购买有效的 SSL 证书。
  2. 在 Curl 中禁用 SSL 验证。(添加 --insecure 选项

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

于 2013-12-29T13:18:45.753 回答
5

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

CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS

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

于 2017-09-21T09:50:13.420 回答
3

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

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

$opts[CURLOPT_VERBOSE] = 1

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

通用名:192.168.0.1(匹配)

这里 192.168.0.1 是一个例子。

于 2017-03-08T13:45:19.167 回答
0

SSL_VERIFYPEER如果您担心中间人攻击,您希望启用它是正确的。

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

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

于 2014-05-19T04:10:16.397 回答
0

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

可以通过在VS2012. (这可以通过在开始时输入 developer 来获得)

以下命令创建一个自签名证书,可用于测试在 URL 为 的 Web 服务器上使用安全套接字层 (SSL) 的 Web 应用程序www.example.com。该-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 证书的更多信息

现在确保这个证书是可信的,这可以通过输入CERTMGRcmd 来完成。

现在创建的证书位于 PERSONAL 文件夹中.. 将其复制并粘贴到受信任的人文件夹中。

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

于 2014-05-19T13:04:22.217 回答
0

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

于 2014-09-06T01:45:27.287 回答
0

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

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

重新启动 Apache/nginx 服务器。

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

瞧!

于 2021-06-22T13:26:18.320 回答
0

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

于 2021-11-18T11:19:46.583 回答