一个运行正常两年的 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();
}
...
如何最好地解决此问题?
最佳答案
根据 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。
关于Perl Paypal IPN 监听器返回 "500 SSL Handshake Failure"消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36000364/