不能100%确定这是Perl问题,但似乎是这样。我有一个与PayPal连接的IPN脚本来验证事务。直到昨天,我才安装了LWP::Protocol::https。从那时起,它一直失败,错误:
Can't connect to www.paypal.com:443 (certificate verify failed)
LWP::Protocol::https::Socket: SSL connect attempt failed error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/local/share/perl5/LWP/Protocol/http.pm line 47.
从bash (使用LWP)运行GET https://www.paypal.com
会产生相同的错误消息。运行GET https://www.gmail.com
是成功的。运行openssl s_client -host paypal.com -port 443
将返回(除其他外) Verify return code: 0 (ok)
。curl "https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate"
成功地接收到来自PayPal的响应。因此,它似乎是特定于Perl的。
模块版本:
LWP 6.13
LWP::Protocol::https 6.06
IO::Socket::SSL 2.015
Mozilla::CA 20141217 (note: I've tried the script both using Mozilla::CA and without it... results have been the same)
如果有其他相关模块,请告诉我。Perl版本为5.10.1。服务器操作系统是RHEL 6。
发布于 2015-05-31 06:27:10
Mozilla::CA 20141217 (注:我已经尝试了使用Mozilla::CA的脚本,但是没有它.结果是一样的)
简而言之:我不知道“没有它”对RHEL6意味着什么,但是请再次尝试使用Mozilla::CA 20130114或从http://curl.haxx.se/docs/caextract.html链接的“旧ca包”。
详细信息:从www.paypal.com获得的证书链
[0] www.paypal.com
[1] Symantec Class 3 EV SSL CA - G2
[2] VeriSign Class 3 Public Primary Certification Authority - G5
链中的最后一个证书由1024证书签名。
/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
自去年年底被Mozilla删除的1024位证书以来,您将不再在当前的Mozilla::CA中找到它们。但是浏览器不需要旧证书,因为创建基于证书的信任链,而1已经使用内置证书,而不是服务器发送的证书2。
虽然这个较新的内置证书也包含在Mozilla::CA中,但由于OpenSSL验证证书的方式中存在一个长期存在的错误,它将不会被使用:它将始终尝试验证最长的链,而不检查是否可能使用更短的链。
有关此问题的详细信息,请参阅
这个问题可以通过使用标志X509_V_FLAG_TRUSTED_FIRST来解决,标志OpenSSL 1.02 (4个月前发布,可能还没有在RHEL中发布),或者使用一个更新、还没有发布的OpenSSL版本来解决这个问题(参见https://rt.openssl.org/Ticket/Display.html?id=3637&user=guest&pass=guest)。
解决这个问题的方法是仍然可以使用旧的1024位CA证书,即要么使用旧的Mozilla::CA或CA包,要么使用通常包含这些旧CA的系统CA存储。另请参阅:
https://stackoverflow.com/questions/30554222
复制相似问题