Проблемы с подключением к серверу с отключенным sslv3 в устаревшем perl

Как следует из названия, я пытаюсь отправить JSON в REST API, используя довольно старую версию Perl, в частности 5.10.1. Я работаю с довольно старой устаревшей кодовой базой на RHEL 6. Рукопожатие завершается с ошибкой 500, потому что на сервере отключен sslv3. Однако я использую версии LWP и IO::Socket::SSL, которые, как я полагаю, номинально поддерживают как минимум TLSv1, который поддерживает сервер, поэтому я не уверен, почему соединение не работает, поскольку он должен просто использовать приемлемый шифр. Похоже, что сервер находится за обратным прокси-сервером Cloudfront, что может иметь значение. Я недостаточно знаю о SSL, чтобы сказать наверняка, но похоже, что проблема заключается в том, как настроен сервер, который меня интересует, и в том, как используемая версия perl и библиотеки реализуют шифр. Используя онлайн-инструмент < /a> Я заметил, что рукопожатие не выполняется в некоторых браузерах, не поддерживающих SNI. Доступная версия openssl должна поддерживать это, но ни одна из реализаций Perl SSL не работает. Это можно обойти?

этот вопрос, кажется, имеет дело с аналогичной проблемой, но они решают ее, устанавливая более новую версию perl, что я не уверен, что смогу сделать, учитывая, что это, вероятно, сломает большие части кодовой базы.

Эта неустраненная ошибка, кажется, случайно задокументировала это поведение, моя проблема идентична той, перечисленных, но я также могу подключиться к хосту openssl. Я не уверен, что это та же проблема, но я использую ту же версию RedHat с тем же программным обеспечением и тем же непоследовательным поведением, поэтому это кажется ценным. Если это поможет, мои версии программного обеспечения следующие

openssl-1.0.1e-58.el6_10.i686
perl-Crypt-SSLeay-0.57-17.el6.x86_64
perl-IO-Socket-SSL-1.31-3.el6_8.2.noarch
perl-Net-SSLeay-1.35-10.el6_8.1.x86_64

Если я побегу

printf 'HTTP/1.0 200 Ok\r\n\r\n' | openssl s_server -accept 2000 -cert certificate.pem -key key.pem -no_ssl2 -no_ssl3 -no_tls1

следующий скрипт (test.pl) может подключаться с использованием тех же библиотек

my $ua = LWP::UserAgent->new(timeout => 600);
my $req = HTTP::Request->new(POST => $ARGV[0]);
$req->content_type('application/json');
$req->content_encoding('gzip');
$req->content('');
my $res = $ua->request($req);
print $res->status_line, "\n";
>perl5.10.1 test.pl https://localhost:2000/
200 Ok

Однако, когда я запускаю чуть более сложную программу, используя те же библиотеки и версию Perl, я получаю ошибки, связанные с рукопожатием sslv3.

500 Can't connect to dev.superquoteapi.fis.rcuh.com:443 (SSL connect attempt failed with unknown errorerror:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure)

Я даже пытался заставить программу использовать только TLSv1, но безрезультатно, следующая строка, похоже, не влияет

my $ua = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0}, SSL_version => '!TLSv12:TLSv1:!SSLv2:!SSLv3', allowed_protocols => ['https']);

Программа, с которой я на самом деле работаю, указана ниже

use LWP;
use IO::Socket::SSL;
my $ua = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0}, SSL_version => '!TLSv12:TLSv1:!SSLv2:!SSLv3', allowed_protocols => ['https']);

my $req = HTTP::Request->new('POST', 'https://dev.superquoteapi.fis.rcuh.com:443/api/quote');

$req->header('Content-Type' => 'application/json');
$req->header('Accept' => 'application/json');
#an api key is required and set in a header, but I won't list that here

open(my $fd, '<', 'data,json') 
    or die "Unable to open file, $!";
my @json=<$fd>;
close($fd)
    or warn "Unable to close the file handle: $!";
$req->content(@json);
my $resp = $ua->request($req);
print $resp->as_string;

Я попытался удалить IO::Socket::SSL и заменить его на Net::SSL, как указано в этом вопросе Как заставить LWP использовать Crypt::SSLeay для HTTPS-запросов? но это не помогает. Код, который я использовал, был

use Net::SSL ();
BEGIN {
  $Net::HTTPS::SSL_SOCKET_CLASS = "Net::SSL"; # Force use of Net::SSL
}

Эти две программы более или менее идентичны. Проблема, похоже, заключается в том, как конкретный сервер https://dev.superquoteapi.fis.rcuh.com обрабатывает запросы ssl. Однако я недостаточно знаю о SSL/TLS, чтобы осмысленно проверить это, поэтому я включил оба для полноты картины.

Я извиняюсь, если этот вопрос немного бессвязный, но мне действительно нужна помощь, и я просто хочу предоставить как можно больше информации. Если я могу предоставить дополнительную информацию или удалить бесполезную информацию, пожалуйста, дайте мне знать, я абсолютно в своем уме.


person ragingSloth    schedule 31.08.2019    source источник
comment
Добавление use IO::Socket::SSL; к работающей программе ломает ее?   -  person ikegami    schedule 31.08.2019
comment
Это не. Его удаление и принудительное использование Net::SSLeay ничего не исправит, я добавил информацию, отражающую это.   -  person ragingSloth    schedule 31.08.2019
comment
Я с трудом вижу разницу между работающей и неработающей программой. Что нужно сделать, чтобы работающая программа перестала работать?   -  person ikegami    schedule 31.08.2019
comment
Замена URL-адреса, вот что делает это. Я не уверен, как именно, но сервер, о котором я действительно забочусь, каким-то образом отличается от установки openssl, что вызывает эту ошибку. Однако тот факт, что я могу подключиться к локальному серверу в качестве доказательства концепции, похоже, означает, что это не потому, что библиотека не может использовать необходимые шифры. Это то, что я нахожу настолько запутанным, поскольку сообщается, что шифр не поддерживается. Мне, вероятно, не нужно включать обе программы, но я недостаточно знаю о ssl, чтобы сказать намного больше, поэтому я включил их. Вы бы порекомендовали мне изменить вопрос?   -  person ragingSloth    schedule 31.08.2019
comment
Ах хорошо. Извините, я не могу вам помочь. Я не знаю, как отлаживать SSL.   -  person ikegami    schedule 31.08.2019
comment
github.com/noxxi/p5-ssl-tools может показать больше.   -  person daxim    schedule 31.08.2019
comment
версии IO::Socket::SSL, доступной в репозиториях, недостаточно для запуска этих инструментов. У меня есть онлайн-инструменты для проверки конечной точки, но я ничего не выделяю. Есть ли что-то особенное, по вашему мнению, мне следует искать @daxim?   -  person ragingSloth    schedule 31.08.2019