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

Bin*_*ntz 2 perl ssl paypal lwp lwp-useragent

不是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.
Run Code Online (Sandbox Code Playgroud)

运行GET https://www.paypal.com从bash中(使用LWP)产生相同的错误消息.OTOH,跑步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)
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ich 7

Mozilla :: CA 20141217(注意:我已经尝试过使用Mozilla :: CA而没有它的脚本......结果是一样的)

简而言之:我不知道"没有它"对于RHEL6意味着什么,但请再次尝试使用Mozilla :: CA 20130114或使用http://curl.haxx.se/docs/caextract链接的"旧版ca-bundle" .html.

详细信息:您从www.paypal.com获得的证书链

[0] www.paypal.com
[1] Symantec Class 3 EV SSL CA - G2
[2] VeriSign Class 3 Public Primary Certification Authority - G5
Run Code Online (Sandbox Code Playgroud)

链中的最后一个证书由1024证书签名

/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
Run Code Online (Sandbox Code Playgroud)

由于去年年底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 的当前错误报告,默认情况下使用X509_V_FLAG_TRUSTED_FIRST(如果可用).此标志设置为2.016(尚未发布)但需要一个Net :: SSLeay版本,它导出此标志(尚未发布)和OpenSSL 1.02(未包含在RHEL中).
  • 针对LWP拉取请求, 以使用系统上的默认CA而不是Mozilla :: CA. 这也可能为您解决问题.请注意,Debian/Ubuntu包含了类似的补丁.我不知道RHEL附带的LWP版本.