我使用Perl v5.14.2和libwww-perl v6.04-1在Debian上运行以下Perl代码段
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new("GET", "https://google.com/");
my $rep = $ua->request($req);
print $rep->status_line;
这会立即返回“500无法连接到google.com:443”。我尝试过使用LWP::Simple, Net::SSLeay, Crypt::SSLeay
等,但没有成功。
奇怪的是,在运行完全相同的Perl和LWP版本的另一个Debian系统上执行相同的代码。
所以我想,底层系统有一些错误,但其他应用程序 - 比如任何浏览器的cURL - 都运行良好。
此外,openssl s_client -connect google.com:443
会在两个系统上返回Verify return code: 20 (unable to get local issuer certificate)
。
有没有人遇到过这种现象并有解决方案?
答案 0 :(得分:7)
而不是:
$ua = LWP::UserAgent->new;
尝试使用它:
$ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
答案 1 :(得分:3)
其他人与LWP 500争夺战的错误:
某些LWP 500错误显然是由另一种类型的SSL问题引起的(使用verify_hostname设置无法解决)。相反,LWP可能正在与HTTPS服务器通信,但响应不是LWP所期望的。就我而言,解决方案是通过以下方式强制使用SSLv3:
my %ssl_options = (SSL_version => 'SSLv3');
$ua = LWP::UserAgent->new(ssl_opts => \%ssl_options),
此外,对于任何想要弄清楚你会得到什么样的500错误的人,请输出以及错误:
print $response->as_string;
对于我的问题(通过设置SSLv3解决),我的$ response-> as_string输出包括:
" SSL例程:SSL23_GET_SERVER_HELLO:sslv3警告意外消息LWP"
我还要说我的代码在早期版本的Ubuntu上运行了好几年。这个问题只出现在我升级Ubuntu之后。我得出的结论是,LWP的新版本可能有多种方式与旧版本不同,所以开发人员要小心!
祝你好运解决你的LWP问题!
答案 2 :(得分:1)
我在带有Strawberry Perl的Windows Server 2003上遇到此问题。错误500是IO::Socket::IP
的问题。
执行模块重新安装(cpan
,强制安装IO::Socket::IP
)解决了问题。