使用paypal.com的Perl,LWP“证书验证失败”

时间:2015-05-31 05:35:24

标签: perl ssl paypal lwp lwp-useragent

不是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 443Verify return code: 0 (ok)成功收到PayPal的回复。所以它似乎确实是Perl特有的。

模块版本:

curl "https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate"

如果有其他相关模块,请告诉我。 Perl版本是5.10.1。服务器操作系统是RHEL 6.

1 个答案:

答案 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存储,可以解决该问题。另见:

  • 对IO :: Socket :: SSL的current bug report默认情况下使用X509_V_FLAG_TRUSTED_FIRST(如果可用)。此标志设置为2.016(尚未发布),但需要一个Net :: SSLeay版本导出此标志(尚未发布)和OpenSSL 1.02(未包含在RHEL中)。
  • A pull request against LWP使用系统上的默认CA而不是Mozilla :: CA.这也可能为您解决问题。请注意,Debian / Ubuntu包含了类似的补丁。我不知道RHEL附带的LWP版本。