不是100%肯定这是一个Perl问题,但似乎是。我有一个与PayPal连接的IPN脚本来验证交易。它工作正常,直到昨天,我安装了LWP :: Protocol :: https。从那时起,它一直没有出现错误:
class Composite < ActiveRecord::Base
has_many :widgets
has_many :gadgets
end
class CompositeSerializer < ActiveModel::Serializer
attributes :id
has_many :widgets
has_many :gadgets
end
从bash(使用LWP)运行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.
会产生相同的错误消息。 OTOH,运行GET https://www.paypal.com
成功。正在运行GET https://www.gmail.com
会返回({1}}之内的openssl s_client -host paypal.com -port 443
。 Verify return code: 0 (ok)
成功收到PayPal的回复。所以它似乎确实是Perl特有的。
模块版本:
curl "https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate"
如果有其他相关模块,请告诉我。 Perl版本是5.10.1。服务器操作系统是RHEL 6.
答案 0 :(得分:7)
Mozilla :: CA 20141217(注意:我已经尝试过使用Mozilla :: CA而没有它的脚本......结果是一样的)
简而言之: 我不知道“没有它”对于RHEL6意味着什么,但请再次尝试使用Mozilla :: CA 20130114或使用http://curl.haxx.se/docs/caextract.html链接的“旧版ca-bundle”。
详细说明: 您从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中找到它们。但浏览器不需要旧证书,因为基于证书[0]和[1]创建信任链已经因为它们使用内置证书而不是服务器发送的证书[2]。
虽然这个较新的内置证书也包含在Mozilla :: CA中,但由于OpenSSL如何验证证书存在长期存在的错误,因此不会使用它:它将始终尝试验证最长的链并且不检查是否存在更短的链条是可能的。
有关此问题的详细信息,请参阅
问题可以通过使用OpenSSL 1.02(4个月前发布,可能还没有在RHEL中)引入的标志X509_V_FLAG_TRUSTED_FIRST解决,或者使用更新的尚未发布的OpenSSL版本来解决问题(见https://rt.openssl.org/Ticket/Display.html?id=3637&user=guest&pass=guest)。
通过使旧的1024位CA证书仍然可用,即使用较旧的Mozilla :: CA或CA捆绑包或使用通常包含这些旧CA的系统CA存储,可以解决该问题。另见: