HTTPS和SSL3_GET_SERVER_CERTIFICATE:证书验证失败,CA正常

Jos*_*hin 206 php ssl curl openssl ca

我正在使用XAMPP进行开发.最近我将xampp的安装从旧版本升级到1.7.3.

现在当我卷曲启用HTTPS的网站时,我得到以下异常

致命错误:未捕获的异常'RequestCore_Exception',消息'cURL resource:Resource id#55; cURL错误:SSL证书问题,验证CA证书是否正常.详细信息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败(60)'

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

我需要帮助来弄清楚我的PHP安装中哪些设置发生了变化,Apache等可以解决这个问题.

Арт*_*цын 288

这是Windows中一个非常常见的问题.你需要设置cacert.pemcurl.cainfo.

从PHP 5.3.7开始,您可以:

  1. 下载https://curl.haxx.se/ca/cacert.pem并将其保存在某处.
  2. 更新php.ini- 添加curl.cainfo ="PATH_TO/cacert.pem"

否则,您需要为每个cURL资源执行以下操作:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");
Run Code Online (Sandbox Code Playgroud)

  • 对于其他试图使用Apache在Windows上解决此问题的人,我必须在我的PHP代码中设置完整路径(即C:\ PATH_TO\cacert.pem).在IIS上,相对路径似乎正常. (7认同)
  • 当使用带有`2.`的WampServer时,必须将该变量添加到两个单独的`php.ini`文件中.请参见http://stackoverflow.com/a/25706713/1101095 (7认同)
  • 这在OS X上的XAMPP中对我有用.它解决了由于无法找到本地证书而导致Wordpress插件无法更新的问题. (2认同)

Mar*_*c B 143

curl曾经包含一个已接受的CA列表,但不再捆绑任何CA证书.所以默认情况下它会拒绝所有SSL证书作为无法验证的.

你必须得到你的CA的证书和点卷曲.有关服务器SSL证书详细信息,请参阅cURLS的详细信息.

  • 只是fyi - 将`CURLOPT_SSL_VERIFYPEER`设置为`false`会破坏使用SSL的目的. (77认同)
  • 然后关闭证书验证(`CURLOPT_SSL_VERIFYPEER` - > false).您要么添加要尝试使用SSL的站点的CA证书,要么禁用CA验证.这是唯一可用的两种选择. (41认同)
  • @Till不会失败*半*SSL的目的吗?您仍然可以在您和您的同伴之间获得隐私:您只是没有同伴的真实性. (13认同)
  • 没有真实性,加密您发送的数据有什么意义?如果你是MITMed,那么无论如何数据都会受到损害 (10认同)
  • 卷曲发生在亚马逊网络服务php库中.我不明白如何在不编辑库代码的情况下修复它. (4认同)
  • 这取决于您发送的内容和攻击者的资源.当然,人们可以MITM你,但没有SSL,任何人都可以被动地窥探你的明文.仅加密SSL仍然比没有SSL更好. (4认同)
  • "你必须得到你的CA证书并且点上它" - >请参阅下面的АртурКурицын的答案以获取详细信息...... (3认同)

Chr*_*row 82

警告:这可能会引入SSL旨在防范的安全问题,从而导致整个代码库不安全.这违背了所有推荐的做法.

但是一个非常简单的解决方案对我来说是:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Run Code Online (Sandbox Code Playgroud)

在致电之前:

curl_exec():
Run Code Online (Sandbox Code Playgroud)

在php文件中.

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

  • ...并且通过禁用证书的验证,您可以对潜在的MITM攻击敞开大门,而SSL/TLS则旨在防范这些攻击.不要这样做! (65认同)
  • 对.我应该在答案中更多地关注这一点.只有在你没有处理任何重要的事情时才这样做.我在localhost上使用它来访问我个人编程的网站. (12认同)
  • ......"*每个知道一点关于SSL的人......"......你会惊讶地发现有多少人甚至不知道一点点关于SSL/TLS的基础知识,并且只是来这里复制/粘贴快速修复他们的错误消息. (5认同)
  • 从我这里下来.这是一个让您的代码正常工作的脏修复方法,但不是解决方案.АртурКурицын提供的答案要好得多. (3认同)
  • @Bruno这是一个完美的解决方案,适用于帮助程序脚本,测试,可信应用程序,内联网,.....每个了解SSL的人都知道在哪些情况下可以跳过证书验证.所以对这个答案的所有'聪明'评​​论以及'不要做这个'之类的事情只是没有用! (2认同)

小智 52

资料来源:http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

卷曲: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); 
Run Code Online (Sandbox Code Playgroud)

让我们看看这两个参数是做什么的.引用手册.

CURLOPT_SSL_VERIFYHOST:1检查SSL对等证书中是否存在公用名.2检查是否存在公用名,并验证它是否与提供的主机名匹配.

CURLOPT_SSL_VERIFYPEER:FALSE停止CURL验证对等方的证书.可以使用CURLOPT_CAINFO选项指定要验证的备用证书,也可以使用CURLOPT_CAPATH选项指定证书目录.如果禁用CURLOPT_SSL_VERIFYPEER,则CURLOPT_SSL_VERIFYHOST也可能需要为TRUE或FALSE(默认为2).将CURLOPT_SSL_VERIFYHOST设置为2(这是默认值)将保证提供给您的证书具有与您用于访问远程资源的URN匹配的"公用名".这是一个健康的检查,但它不能保证您的程序没有被解除.

进入'中间人'

您的程序可能会误导与另一台服务器通话.这可以通过几种机制来实现,比如dns或arp中毒(这是另一天的故事).入侵者还可以使用您的程序所期望的相同"通用名称"对证书进行自签名.通信仍然会被加密,但你会把你的秘密泄露给冒名顶替者.这种攻击被称为"中间人"

打败'中间人'

好吧,我们需要验证提交给我们的证书是否真实.我们通过将它与我们合理*信任的证书进行比较来做到这一点.

如果远程资源受到Verisign,GeoTrust等主要CA之一颁发的证书的保护,您可以安全地与Mozilla的CA证书包进行比较,您可以从http://curl.haxx.se/docs/caextract获取该证书包. html的

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

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");
Run Code Online (Sandbox Code Playgroud)

以上所有信息转到:http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

  • 通常认为对您的信息来源给予信任是礼貌的,只引用与问题相关的某些部分,而不是简单地在此处复制和粘贴它! (38认同)
  • 至少迪帕克努力研究它.@danherd所以danherd,你刚刚做了研究,发现他从某个地方拿了代码?这段代码的归属权是什么?而不是浪费你的时间去寻找别人的错误,而是试着自己帮助别人.不要打架,分享! (5认同)

Nat*_*ate 17

上面的解决方案很棒,但是如果你使用的是WampServer,你可能会发现将curl.cainfo变量设置为php.ini不起作用.

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

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx
Run Code Online (Sandbox Code Playgroud)

第一个显然用于通过Web浏览器调用PHP文件,而第二个用于通过命令行调用命令时shell_exec().

TL; DR

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


Spe*_*ams 6

为了爱所有神圣的事物...

就我而言,我必须将openssl.cafilePHP config变量设置为PEM文件路径。

我相信,确实有很多系统curl.cainfo需要在PHP的配置中进行设置,但是在我使用的环境中,这是eboraas / laravel docker容器,它使用Debian 8(jessie)和PHP 5.6,设置该变量没有成功。

我注意到,的输出php -i未提及有关该特定配置设置的任何内容,但其中确实包含几行openssl。同时有openssl.capathopenssl.cafile选项,但是只需设置第二个选项,就可以通过PHP允许curl最终与HTTPS URL兼容。