为什么LWP无法连接" 500 SSL协商失败"?

时间:2017-05-18 18:51:29

标签: perl openssl centos lwp

My Perl脚本将一些信息发送到远程服务器。

以下是代码的一部分

#!/var/hvmail/libexec/perl

use strict;

use HTTP::Request::Common qw(POST);
use LWP::UserAgent;

use constant HANDLER_URL => "https://www.website.com/handler.php";

$ENV{HTTPS_DEBUG} = 1;

my $ua = LWP::UserAgent->new;

# Some DB stuff, not applicable
my $row; # This is a DB row ($sth->fetchrow_hashref())   

my $req = POST ''.HANDLER_URL, [ %$row ]; 
my $res = $ua->request($req);

$res->is_success false $res->status_line

500 SSL negotiation failed

我们正在运行CentOS 6.4,Perl 5.10.1,OpenSSL 1.0.1e-fips。

更新

这里有完整的输出:

SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL3 alert read:fatal:handshake failure
SSL_connect:error in SSLv2/v3 read server hello A
SSL_connect:before/connect initialization
SSL_connect:SSLv3 write client hello A
SSL3 alert read:fatal:handshake failure
SSL_connect:failed in SSLv3 read server hello A
SSL_connect:before/connect initialization
SSL_connect:SSLv2 write client hello A
SSL_connect:failed in SSLv2 read server hello A
Error: [ 500 SSL negotiation failed:  ]

请求的命令输出

Can't locate Net/SSLeay.pm
Can't locate LWP/Protocol/https.pm

2 个答案:

答案 0 :(得分:3)

您似乎依赖Crypt::SSLeay。你不应该。它已经过时且不完整。

安装最新的LWP::Protocol::https,它将升级您的LWP并安装由IO::Socket::SSLNet::SSLeay组成的首选SSL / TLS堆栈。

A web search shows有CentOS6存储库,其中包含LWP::Protocol::https的RPM包。

服务器已禁用SSLv3支持,这意味着协商失败。

安装软件包后,如果仍然看到相同的错误,请确保您的脚本不强制使用Crypt::SSLeay。也就是说,确保脚本中的任何位置都不会显示以下内容:

use Net::HTTPS;
$Net::HTTPS::SSL_SOCKET_CLASS = 'Net::SSL';

local $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';

use Net::SSL;

如果您仍遇到问题,请确保脚本的运行时环境中没有PERL_NET_HTTPS_SSL_SOCKET_CLASS环境变量。

另外,试试

$ /var/hvmail/libexec/perl -MNet::SSLeay -le 'print $Net::SSLeay::VERSION'

$ /var/hvmail/libexec/perl -MLWP::Protocol::https -le 'print $LWP::Protocol::https::VERSION`'

并报告输出。

我怀疑问题是为系统的perl安装了新软件包,而您似乎可能有一个单独的perl

如果是这种情况,您应该使用/var/hvmail/libexec/perl单独安装每个包。例如:

$ curl -O https://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7043.tar.gz
$ tar xvf App-cpanminus-1.7043.tar.gz
$ cd App-cpanminus-1.7043
$ /var/hvmail/libexec/perl Makefile.PL
$ make install

找出安装cpanm的位置。我希望/var/hvmail/libexec

$ /var/hvmail/libexec/cpanm LWP::Protocol::https

另请参阅Updating all outdated Perl modules,但这可能会对制作造成风险。仍然,安装App::cpanoutdated,看看你的Perl模块过时了可能是有用的

现在,请记住,修补这样的生产安装是有风险的。确保您有办法在出现问题时撤消更改。

最后,请注意OpenSSL 1.0.1 versions are no longer supported

  

关于当前和未来的版本,OpenSSL项目采用了以下政策:

     
      
  • 版本1.1.0将一直支持到2018-08-31。
  •   
  • 版本1.0.2将一直支持到2019-12-31(LTS)。
  •   
  • 不再支持1.0.1版。
  •   
  • 不再支持1.0.0版。
  •   
  • 不再支持0.9.8版。
  •   

答案 1 :(得分:1)

不需要''.HANDLER_URL。它看起来很难看,HANDLER_URL很好

您无法解释$row中的内容或POST来电需要的内容,但看起来像这样

my $req = POST ''.HANDLER_URL, [ %$row ]; 
my $res = $ua->request($req);

应该是

my $res = $ua->post(HANDLER_URL, $row);