Ошибка 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,955
  • perl 5.14.2
  • LWP::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';
}
Другие вопросы по тегам