Perl PayPal IPN 侦听器返回“500 SSL 握手失败”消息

Posted

技术标签:

【中文标题】Perl PayPal IPN 侦听器返回“500 SSL 握手失败”消息【英文标题】:Perl PayPal IPN Listener Returning "500 SSL Handshake Failure" message 【发布时间】:2016-06-30 05:57:44 【问题描述】:

一个运行正常两年的 perl 脚本刚刚开始在回发 IPN 消息时返回“500 SSL 握手失败”错误。我的主机服务支持 SHA 256、TLS 1.2 和 HTTP/1.1。我正在使用我的主机服务的共享证书。 代码(来自 PayPal 的示例脚本):

# read post from PayPal system and add 'cmd'
read (STDIN, $query, $ENV'CONTENT_LENGTH');
$query .= '&cmd=_notify-validate';

# post back to PayPal system to validate
$ua = LWP::UserAgent->new(ssl_opts =>  verify_hostname => 1 );
$req = HTTP::Request->new('POST', 'https://www.sandbox.paypal.com/cgi-bin/webscr');
$req->content_type('application/x-www-form-urlencoded');
$req->header(Host => 'www.sandbox.paypal.com');
$req->content($query);
$res = $ua->request($req);

if ($res->is_error) 
 # HTTP error
 $retmsg = "HTTP Error:<br />";
 $retmsg .= $res->status_line();

...

如何最好地解决这个问题?

【问题讨论】:

很难说没有更多细节,但我猜你使用的是旧版本的 LWP/IO::Socket::SSL 或 OpenSSL。在这种情况下,您的服务器支持什么并不重要。请添加库的版本:perl -MLWP::UserAgent -MIO::Socket::SSL -e 'printf "openssl=%x\nio-ssl=%s\nlwp=%s\nperl=%s\n",Net::SSLeay::OPENSSL_VERSION_NUMBER(),IO::Socket::SSL-&gt;VERSION,LWP::UserAgent-&gt;VERSION,$^V' @Steffen 非常感谢您的建议。当我执行此命令时,我在 -e 第 1 行的 EOF 之前的任何位置收到消息“找不到字符串终止符”。我看不出语法有任何问题。我错过了什么? 无论出于何种原因,剪切+粘贴似乎添加了一些奇怪的字符。尝试使用pastebin.com/gqjcCvsT 试过 pastebin - 相同的消息。检查了不可显示的字符 - 看起来很干净。还有其他想法吗? 我的猜测是,您正在使用 Windows,然后在命令行上使用它们奇怪的转义方式。使用pastebin.com/t3ae1dNn中的代码,然后将其放入一个文件中,然后用Perl执行这个文件。 【参考方案1】:

根据SSLLabs,该站点仅支持 TLS 1.2,它不接受 TLS 1.0 或 TLS 1.1。根据您的评论,您使用的是 OpenSSL 版本 1.0.0e (1000005f)。但此版本尚不支持 TLS 1.2,因为仅在 1.0.1 版本中添加了此类支持。

这意味着您的系统太旧,无法支持 TLS 1.2。您至少需要升级 OpenSSL 版本,但最好升级整个系统。请注意,仅安装新版本的 OpenSSL 无济于事。相反,您需要重新编译 Perl 中使用该库的所有模块,即在这种情况下尤其是 Net::SSLeay。

【讨论】:

感谢 Steffen,感谢您的时间和建议。了解这是我的客户的“关键任务”应用程序,我需要找到一些解决方案。找到一个提供支持 TLS 1.2 的最新模块库(如果存在这样的主机)并迁移系统的 Web 主机是否有意义,或者按照您的建议花时间重新编译必要的模块和在本地图书馆中引用它们。 我没有编译 Perl 模块的经验,但我当然愿意学习 - 我只关心学习曲线所需的时间,因为 PayPal 计划在其生产中进行这些更改环境很快。顺便说一句,我的主机提供商 - iPower - 对更新他们库中的 Perl 模块几乎没有兴趣,即使有人指出其中一些模块不符合新的安全标准。 @VanScott:如果您只使用共享主机,我怀疑自己是否可以升级到更新的 OpenSSL 版本。如果您的主机不愿意这样做,您可能需要更改。我不能给你任何建议哪个主机提供所需的支持,但任何提供最新软件的主机都应该有它,因为必要的 OpenSSL 版本 1.0.1 已经在大约 4 年前发布。 我的主机服务表示对更新 OpenSSL 没有兴趣,因此我将寻找其他服务。感谢您的帮助!

以上是关于Perl PayPal IPN 侦听器返回“500 SSL 握手失败”消息的主要内容,如果未能解决你的问题,请参考以下文章

Web.config - PayPal IPN 侦听器 - HTTP 错误代码 500:内部服务器错误

IPN 验证返回 INVALID,因为 PayPal 在 POST 中向 IPN 侦听器发送了不正确的字符集

Paypal IPN 侦听器不返回值

在 PayPal Sandbox 中没有收到对侦听器的 IPN 响应

Rails 监听器 Paypal IPN 总是返回 INVALID

Paypal 中的 IPN 与 PDT