Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl LWP:UserAgent出现500错误_Perl_Lwp Useragent - Fatal编程技术网

Perl LWP:UserAgent出现500错误

Perl LWP:UserAgent出现500错误,perl,lwp-useragent,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

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

找到
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';
} 我尝试了一千种不同的方法来连接到URL

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
)访问该URL)

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

https + example.com:example-port + /path/to/another/page.
如果有人能帮我找出我做错了什么,我会很感激的

编辑 为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创建想到的不同混合(带/out-verification/SSL_-version/)

my $ua = LWP::UserAgent->new; #(ssl_opts => { verify_hostname => 1, SSL_version => 'TLSv1' });
因为这里也发现了这一点:


编辑2: 代码

可以在带有 perl 5.14.2 LWP:用户::代理6.04 IO::Socket::SSL 1.76 Net::SSLeay 1.48

但不是我的 perl 5.14.2 LWP:用户::代理6.06 IO::Socket::SSL 1.955 Net::SSLeay 1.55
而且我似乎找不到更多的区别…

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

LWP::UserAgent->new(ssl_opts => { verify_hostname => 0});
这使我怀疑您的问题可能与有关,但我没有设置代理来测试这一点

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

#!/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;
并在此处报告信息,以及
perl
和版本

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

  • IO::Socket::SSL
    1.955
  • perl
    5.14.2
  • LWP::UserAgent
    6.06
请加上

use Net::SSLeay;
$Net::SSLeay::trace = 2;
到原始脚本的顶部,并使用调试输出更新您的问题。

(基于我的答案)

…sis-t.redsys.es:25443

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

$ 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数据包。如果您不在
s_client
调用中添加
servername
选项,请求将神奇地成功,因为数据包现在小于255字节。因为版本1.962(大约一年前)IO::Socket::SSL将使用更小(更安全)的密码集来解决此类问题

Crypt::SSLeay使用OpenSSL的默认密码集,这使得本例中的数据包只有248字节,因此足够小。这就是为什么它与Crypt::SSLeay一起工作。但请注意,Crypt::SSLeay不会根据服务器证书对主机名进行任何验证,因此对中间人攻击开放

对于当前版本的IO::Socket::SSL,问题应该得到解决,即您不需要任何特殊设置,可以保持启用验证等。因此,您的最新代码在我的机器上使用IO::Socket::SSL 2.002时不会出现问题


但是,由于您使用的是代理,您也应该使用最新版本的LWP::UserAgent和LWP::Protocol::https,因为只有在版本6.06中添加了对IO::Socket::SSL后端的适当代理支持(如果您使用Debian或类似Ubuntu的派生版本,可能已经在6.04中了)。虽然看起来您正在使用LWP::UserAgent 6.06,但没有显示LWP::Protocol::https的版本。此单独的模块也必须是版本6.06,才能具有工作代理支持。

再次检查url?
https://sis-t.redsys.es:25443/si\n+s/entradaXMLEntidad/
URL如图所示。看起来在我发布后它有点被修改了行太长。我将尝试在主消息中修复它。他们可以通过用户代理阻止您。我不认为这两点可能会误导某人,对此表示抱歉。执行您的代码时,IO::Socket::SSL 1.955 Perl版本为5.14.2 LWP::UserAgent版本为6。06@squale我只是想确定你没有使用所有东西的古代版本如果情况并非如此,请打开调试,并用输出编辑您的问题。
$ openssl s_client -cipher 'ALL:!LOW' -connect  sis-t.redsys.es:25443 -servername sis-t.redsys.es
CONNECTED(00000004)
... and there it hangs ...