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
答案 0 :(得分:3)
您似乎依赖Crypt::SSLeay。你不应该。它已经过时且不完整。
安装最新的LWP::Protocol::https,它将升级您的LWP并安装由IO::Socket::SSL和Net::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);