Php HTTPS和SSL3\u获取\u服务器\u证书:证书验证失败,CA正常

Php HTTPS和SSL3\u获取\u服务器\u证书:证书验证失败,CA正常,php,ssl,curl,openssl,ca,Php,Ssl,Curl,Openssl,Ca,我正在用它来发展。最近,我将xampp的安装从旧版本升级到1.7.3 现在,当我创建启用HTTPS的站点时,我得到了以下异常 致命错误:未捕获的异常“RequestCore\u异常”包含消息 '卷曲资源:资源 id#55;cURL错误:SSL证书问题,请验证CA证书是否正常。细节: 错误:14090086:SSL例程:SSL3_获取_服务器_证书:证书验证失败(60)' 每个人都建议使用PHP代码中的一些特定curl选项来解决这个问题。我认为不应该这样。因为我的旧版本XAMPP没有任何问题,只是

我正在用它来发展。最近,我将xampp的安装从旧版本升级到1.7.3

现在,当我创建启用HTTPS的站点时,我得到了以下异常

致命错误:未捕获的异常“RequestCore\u异常”包含消息 '卷曲资源:资源 id#55;cURL错误:SSL证书问题,请验证CA证书是否正常。细节: 错误:14090086:SSL例程:SSL3_获取_服务器_证书:证书验证失败(60)'

每个人都建议使用PHP代码中的一些特定curl选项来解决这个问题。我认为不应该这样。因为我的旧版本XAMPP没有任何问题,只是在安装了新版本之后才出现问题


我需要帮助来找出PHP安装中的哪些设置更改,Apache等可以解决此问题。

curl
用于包含已接受的证书颁发机构(CA)列表,但自7.18.1及以后不再捆绑任何CA证书。因此,默认情况下,它将拒绝所有TLS/SSL证书,因为它们无法验证

您必须获取CA的根证书并指向它。更多详细信息请访问curl。

警告:这可能会引入SSL旨在防止的安全问题,从而使整个代码库不安全。这违反了所有推荐做法。

但对我来说,一个非常简单的解决办法是:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
致电前:

curl_exec():
在php文件中

我相信这会禁用SSL证书的所有验证。

来源:

Curl:SSL证书问题,请验证CA证书是否正常 2006年4月7日 使用Curl打开安全url时,可能会出现以下错误:

SSL证书问题,请验证CA证书是否正常

我将解释错误的原因以及您应该如何处理它

消除错误的最简单方法是添加 下面是脚本的两行。此解决方案带来了安全性问题 冒这个险

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 
让我们看看这两个参数的作用。引用手册

CURLOPT_SSL_VERIFYHOST:1检查SSL对等证书中是否存在公共名称。2检查是否存在一个通用名称 并验证它是否与提供的主机名匹配

CURLOPT\u SSL\u VERIFYPEER:FALSE可阻止CURL验证对等方的证书。可以使用备用证书进行验证 使用CURLOPT_CAINFO选项或证书目录指定 可以使用CURLOPT_CAPATH选项指定。 CURLOPT_SSL_VERIFYHOST也可能需要为TRUE或FALSE,如果 CURLOPT_SSL_VERIFYPEER已禁用(默认为2)。背景 CURLOPT_SSL_VERIFYHOST为2(这是默认值)将保证 提交给您的证书具有“通用名称” 匹配用于访问远程资源的URN。这是 健康检查,但不能保证您的程序不正常 判决

输入“中间人” 您的程序可能会被误导而与另一台服务器对话 相反这可以通过多种机制实现,如dns或 arp中毒(这是另一天的故事)。入侵者可以 还可以使用与您的程序相同的“comon name”对证书进行自签名 她正在期待。通信仍将加密,但您将 把你的秘密泄露给骗子。这种攻击是非常危险的 叫做“中间人”

击败“中间人” 好的,我们需要核实提交给我们的证书是否正确 真的很好。我们通过将其与证书进行比较来实现这一点 合理的信任

如果远程资源受以下其中一个颁发的证书保护: 主要的CA如Verisign、GeoTrust等,您可以放心地进行比较 针对Mozilla的CA证书包,您可以从

将文件
cacert.pem
保存在服务器中的某个位置,并设置 脚本中的以下选项

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

对于以上所有信息,请注意:

这是Windows中非常常见的问题。您只需将
cacert.pem
设置为
curl.cainfo

从PHP 5.3.7开始,您可以:

  • 下载并保存到某个地方
  • 更新php.ini——将curl.cainfo=“PATH\u添加到/cacert.pem”
  • 否则,您将需要对每个cURL资源执行以下操作:

    curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");
    

    有时,如果您尝试联系的应用程序具有自签名证书,则来自的普通cacert.pem无法解决问题

    如果您确定服务端点url,请通过浏览器点击它,以“X 509带链证书(PEM)”格式手动保存证书。将此证书文件指向

    curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   
    

    解决方案非常简单!将此行放在
    curl\u exec
    之前:

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    

    对我来说,它是有效的。

    上述解决方案非常好,但是如果您使用WampServer,您可能会发现在
    php.ini
    中设置
    curl.cainfo
    变量不起作用

    我最终发现WampServer有两个
    php.ini
    文件:

    C:\wamp\bin\apache\Apachex.x.x\bin
    C:\wamp\bin\php\phpx.x.xx
    
    第一个显然用于通过web浏览器调用PHP文件,而第二个用于通过命令行或
    shell\u exec()
    调用命令

    TL;DR


    如果使用WampServer,则必须将
    curl.cainfo
    行添加到两个
    php.ini
    文件中。

    为CURLOPT\u cainfo设置curl选项时,请记住使用单引号,使用双引号只会导致另一个错误。因此,您的选项应该如下所示:

    curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');
    
    此外,在php.ini文件中,设置应写成:(注意我的双引号)

    我把它直接放在这行下面:
    extension=php\u curl.dll

    (仅出于组织目的,您可以将其放在您的任何位置。)
    curl.cainfo = "C:\wamp\www\mywebfolder"
    
    vi /etc/php.d/20-curl.ini
    
    curl.cainfo="/etc/ssl/certs/ca-bundle.crt"
    
    openssl s_client -host www.googleapis.com -port 443
    
    Certificate chain
     0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
       i:/C=US/O=Google Inc/CN=Google Internet Authority G2
     1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
       i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
     2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
       i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
    
    <?php echo phpinfo();
    
    openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem
    
    sudo nano /usr/local/php5/ssl/certs/cacert.pem