Ошибка 500 с LWP:UserAgent
Решено! спасибо за каждую помощь, которую я имел:)
Найденный http://stackru.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 (так как в конце концов, мне придется получить доступ к этому URL с POST
).
Конечно, я убедился, что смог получить эту страницу из обычного браузера. Я удостоверился, что мой код всегда был в состоянии соединиться с другими страницами в форме
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 проверкой /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: Пользователь:: Агент 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, и я, кажется, не могу найти больше различий...
3 ответа
(На основе моего ответа от 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 перед сервером, которые просто отбрасывают пакеты ClientHello размером более 255 байт. Если вы не добавите servername
вариант в s_client
вызов запроса будет магически успешным, потому что пакет теперь меньше 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, потому что надлежащая поддержка прокси с IO::Socket::SSL была добавлена только в версию 6.06 (может быть уже в 6.04, если вы используете Debian или дополнительный продукт, такой как Ubuntu). Хотя похоже, что вы используете LWP::UserAgent 6.06, вы не показываете версию LWP::Protocol::https. Этот отдельный модуль должен быть версии 6.06, чтобы иметь поддержку рабочего прокси.
Прежде всего, учитывая, что сертификат сайта не является самоподписанным, нет веских причин для:
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;
и сообщите информацию здесь, вместе с вашим perl
и версии LWP.
Согласно вашему комментарию вы используете:
IO::Socket::SSL
1,955perl
5.14.2LWP::UserAgent
6,06
Пожалуйста, добавьте
use Net::SSLeay;
$Net::SSLeay::trace = 2;
в начало исходного сценария и обновите свой вопрос выводом отладки.
Это также поможет:
use LWP::UserAgent;
my $browser = LWP::UserAgent->new;
my $url = 'https://sis-t.redsys.es:25443/sis/entradaXMLEntidad/';
my @ns_headers = (
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0',
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Charset' => 'iso-8859-1,*,utf-8',
'Accept-Language' => 'en-US,en;q=0.5',
'Connection' => 'keep-alive',
);
$response = $browser->get($url, @ns_headers);
if($response->is_success) {
print $response->status_line;
} else {
print 'failed';
}