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