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

Php SSL对等证书或SSH远程密钥不正常,php,apache,ssl,curl,Php,Apache,Ssl,Curl,我正在测试一个使用curl\u execphp函数和CA证书的API,但是出了点问题,我有点不知所措 我已经在apache VirtualHost上配置了SSL,看起来还可以(打开https::://[myVHost]…工作) 但是,API curl调用返回了以下消息: SSL对等证书或SSH远程密钥不正常 我对SSL不是很有经验,所以我对造成这种情况的原因没有什么想法 更新: 这是我在cURL请求中使用的代码,我已经注释了2行并更改了它们的值(查看“TODO”行),这样它就可以工作了,但是

我正在测试一个使用
curl\u exec
php函数和CA证书的API,但是出了点问题,我有点不知所措

我已经在apache VirtualHost上配置了SSL,看起来还可以(打开
https::://[myVHost]
…工作)

但是,API curl调用返回了以下消息:

  • SSL对等证书或SSH远程密钥不正常
我对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 Certificate,当设置CURLOPT_SSL_VERIFYPEER选项时,它将不会通过

有两种解决方案:

  • 购买有效的SSL证书
  • 在Curl中禁用SSL验证。()
  • 如果禁用验证,则无法确定是否确实在与主机通信。
    因此,这取决于您需要的安全级别。

    如果您担心中间人攻击,那么启用
    SSL\u VERIFYPEER
    是正确的

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


    如果您无法使其正常工作,并且您连接的API有一个SSL证书,该证书在您的正常浏览器中工作而没有警告,则您应该能够将
    $path
    设置到服务器上的CA根捆绑包。

    您可以生成有效的SSL证书,并确保它存储在受信任的文件夹中

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

    以下命令创建一个自签名证书,可用于测试在URL为
    www.example.com
    的web服务器上使用安全套接字层(SSL)的web应用程序。
    -eku
    选项定义的OID将该证书标识为
    SSL服务器证书
    。证书存储在my store中,在计算机(而不是用户)级别可用。证书的私钥是可导出的,证书的有效期为2010年5月10日至2011年12月22日

    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

    有关如何创建

    现在,请确保此证书受信任,可以通过在cmd中键入
    CERTMGR
    来完成此操作

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


    这应该能奏效。如果不行,请告诉我

    我也有同样的问题。我遵循这里的指示:它解决了我的问题

    基本上我去了/etc/resolv.conf

    并替换任何

    OpenDNS服务器:

    208.67.222.222

    208.67.220.220

    谷歌的公共DNS服务器:

    名称服务器8.8.8.8
    nameserver8.8.4.4

    虽然我在回复一篇老文章,但我认为它会帮助新的观众-

    您可以通过添加

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

    通用名称:192.168.0.1(匹配)


    这里192.168.0.1是一个例子。

    除了
    CURLOPT\u SSL\u VERIFYPEER
    之外,还有两个其他设置可能被更改为
    false
    /
    0

    CURLOPT_SSL_VERIFYHOST
    CURLOPT_SSL_VERIFYSTATUS
    

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

    我们需要您用来发出请求的完整代码,包括所有设置的curl选项。另外,这是一个自签名证书吗?信息添加:)关于自签名证书的问题我不知道:证书是随API提供的…您已成功确定根本原因:
    CURLOPT\u SSL\u VERIFYHOST
    为2。当设置为2时,curl将验证证书是否有效,以及证书是否由其信任的CA颁发。如果远程证书是自签名的,或者不是由它信任的CA颁发的,它将发出呜呜声,并给出一个与您收到的错误类似的错误。如果您从第三方获得证书,则需要说服curl信任签署证书的CA。你说你拿到了CA证书,对吗?你用它做了什么?我有API提供的
    ca certs.crt
    文件,我只是在使用文档中描述的一切。。。