LWP出现500错误:UserAgent

时间:2014-11-04 10:13:10

标签: perl lwp-useragent

解决了! 感谢我的每一个帮助:)

找到http://stackoverflow.com/questions/8026524/how-do-i-force-lwp-to-use-cryptssleay-for-https-requests 并用

解决了我的问题
use Net::SSL (); # From Crypt-SSLeay
BEGIN {
  $Net::HTTPS::SSL_SOCKET_CLASS = "Net::SSL"; # Force use of Net::SSL
  $ENV{HTTPS_PROXY} = 'http://10.0.3.1:3128';

}

我尝试了几种不同的方法来连接到网址

https://sis-t.redsys.es:25443/sis/entradaXMLEntidad/

我似乎无法得到别的东西,而不是500错误。

我试过的最新代码是

require LWP::UserAgent;

## Code added according to Sinan Ünür s comment
use Net::SSLeay;
$Net::SSLeay::trace = 2;
## End of code added

my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0});
$ua->agent("Mozilla/8.0");
$ua->timeout(10);
my $url = 'https://sis-t.redsys.es:25443/sis/entradaXMLEntidad/'

my $req = HTTP::Request->new( GET => $url);
$req->header( 'Accept' => 'text/html' );

# send request
my $res = $ua->request($req);

# check the outcome
if ( $res->is_success ) {
    print $res->decoded_content;
} else {
    print "Error: " . $res->status_line . "\n";
}

我尝试使用和不使用

$ua->proxy('https', 'http://myproxy');

我尝试了POST和GET(因为最后,我将不得不使用POST访问该网址。)

当然,我确保能够从常规浏览器中获取此页面。我确保我的代码始终能够以

的形式连接到其他页面
https + example.com:example-port + /path/to/another/page.

如果有人能帮助我找到我做错的事情,我会感激不尽。

EDIT 增加的SinanÜnür评论代码产生了以下错误

DEBUG: .../IO/Socket/SSL.pm:449: socket not yet connected
DEBUG: .../IO/Socket/SSL.pm:451: socket connected
DEBUG: .../IO/Socket/SSL.pm:469: ssl handshake not started
DEBUG: .../IO/Socket/SSL.pm:504: using SNI with hostname sis-t.redsys.es
DEBUG: .../IO/Socket/SSL.pm:527: set socket to non-blocking to enforce timeout=10
DEBUG: .../IO/Socket/SSL.pm:550: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:560: waiting for fd to become ready: SSL wants a read first
DEBUG: .../IO/Socket/SSL.pm:570: handshake failed because socket did not became ready
Error: 500 Can't connect to sis-t.redsys.es:25443

输出是相同的组合我想到的ua创建的混合物(带/出验证/ SSL_version /...

my $ua = LWP::UserAgent->new; #(ssl_opts => { verify_hostname => 1, SSL_version => 'TLSv1' });

此处也发现了这一点:http://www.perlmonks.org/?node_id=1106004


EDIT2: 代码

#!/usr/bin/perl -w
use strict;

use Net::SSLeay;
$Net::SSLeay::trace = 2;

require LWP::UserAgent;

my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0, SSL_version => 'TLSv1:!TLSv11:!TLSv12:!SSLv2:!SSLv3'});
$ua->agent("Mozilla/8.0");
$ua->timeout(10);

my $req = HTTP::Request->new( GET => "https://sis-t.redsys.es:25443/sis/entradaXMLEntidad/");
$req->header( 'Accept' => 'text/html' );

# send request
my $res = $ua->request($req);

# check the outcome
if ( $res->is_success ) {
    print $res->decoded_content;
} else {
    print "Error: " . $res->status_line . "\n";
}

在有机器的机器上正常工作     perl 5.14.2     LWP:User :: Agent 6.04     IO :: Socket :: SSL 1.76     Net :: SSLeay 1.48

但不是我的     perl 5.14.2     LWP:User :: Agent 6.06     IO :: Socket :: SSL 1.955     Net :: SSLeay 1.55 我似乎无法找到更多的差异......

2 个答案:

答案 0 :(得分:2)

(根据我http://www.perlmonks.org/?node_id=1106240的答案)

  

... sis-t.redsys.es:25443

此服务器存在一些严重问题。您使用的IO :: Socket :: SSL版本的默认密码集(1.76)是" ALL:!LOW"。如果此密码集与TLS1.0或更高版本一起使用,则连接只会挂起。您可以使用s_client验证这一点:

$ openssl s_client -cipher 'ALL:!LOW' -connect  sis-t.redsys.es:25443 -servername sis-t.redsys.es
CONNECTED(00000004)
... and there it hangs ...

这种问题通常与服务器前面的旧F5负载均衡器有关,它只会丢弃大于255字节的ClientHello数据包。如果您不在servername调用中添加s_client选项,请求将会神奇地成功,因为数据包现在小于255字节。从版本1.962(大约一年前)开始,IO :: Socket :: SSL将使用更小(更安全)的密码集来解决此类问题。

Crypt :: SSLeay使用默认的OpenSSL密码集,这使得这种情况下的数据包只有248个字节,因此足够小。这就是它与Crypt :: SSLeay一起工作的原因。但请注意,Crypt :: SSLeay不会根据服务器证书对主机名进行任何验证,因此可以接受中间人攻击。

使用当前版本的IO :: Socket :: SSL时,问题应该得到解决,那就是您不需要任何特殊设置,并且可以启用验证等等。因此,我的最新代码在我的机器上运行时没有问题: :Socket :: SSL 2.002。

但是,由于您使用的是代理,因此您应该使用最新版本的LWP :: UserAgent和LWP :: Protocol :: https,因为IO :: Socket :: SSL后端的正确代理支持仅添加到版本6.06(如果您使用Debian或像Ubuntu这样的衍生产品,它可能已经在6.04了)。虽然看起来您使用的是LWP :: UserAgent 6.06,但您不会显示LWP :: Protocol :: https的版本。此单独的模块也必须是版本6.06才能获得工作代理支持。

答案 1 :(得分:0)

首先,鉴于该网站的证书不是自签名的,没有充分的理由:

LWP::UserAgent->new(ssl_opts => { verify_hostname => 0});

这让我怀疑您的问题可能与Crypt::SSLeay有关,但我没有设置代理来测试此问题。

在任何情况下,除非您发现问题是由于您的抓取工具被阻止,或者是与代理设置相关的问题,否则我会要求您运行以下代码:

#!/usr/bin/env perl

use strict;
use warnings;

use LWP::UserAgent;
use Net::HTTPS;
my $sc = $Net::HTTPS::SSL_SOCKET_CLASS;
my $v = eval "require $sc; \${${sc}::VERSION}";
print "$_\n" for $sc, $v;

并在此处报告信息,以及您的perlLWP版本。

根据您的评论,您正在使用:

  
      
  • IO::Socket::SSL 1.955
  •   
  • perl 5.14.2
  •   
  • LWP::UserAgent 6.06
  •   

请添加

use Net::SSLeay;
$Net::SSLeay::trace = 2;

到原始脚本的顶部,并使用调试输出更新您的问题。

相关问题