IO::Socket:: SSL, похоже, игнорирует SSL_VERIFY_NONE

#perl #ssl #io-socket-ssl

#perl #ssl #io-socket-ssl

Вопрос:

IO::Socket:: SSL, похоже, игнорирует SSL_VERIFY_NONE; это на OSX 10.14.1 с perl 5.18.2 и CentOS 6.10 с perl 5.10.1:

 #!/usr/bin/perl

#
#  sslt
#
#  Test ssl connections to self-signed sites
#

use strict;
use warnings;

use IO::Socket::SSL qw( SSL_VERIFY_NONE );
use LWP::UserAgent;

my $url = 'https://internal_site:18443/rest/v1';
my $method = 'GET';

my $ua = LWP::UserAgent->new;
$ua->agent('sslt/0.1');
$ua->ssl_opts(SSL_verify_mode => SSL_VERIFY_NONE);

# Create a request
my $req = HTTP::Request->new($method => $url);

print STDERR "Raw request ($method): $urln";

# Send request to the user agent and get a response back
my $res = $ua->request($req);
print STDERR "Raw response: ", $res->message, " (", $res->code, ")n";

exit 0;
  

приводит к:

 $ sslt
Raw request (GET): https://internal_site:18443/rest/v1
Raw response: Can't connect to internal_site:18443 (certificate verify failed) (500)
  

Ответ №1:

Это не игнорирование IO ::Socket :: SSL SSL_verify_mode , а переопределение LWP. Из LWP ::Протокол::https:

 sub _extra_sock_opts
{
    my $self = shift;
    my %ssl_opts = %{$self->{ua}{ssl_opts} || {}};
    if (delete $ssl_opts{verify_hostname}) {
        $ssl_opts{SSL_verify_mode} ||= 1;                  <<<<<<<<<<<<<<<<<<<<
        $ssl_opts{SSL_verifycn_scheme} = 'www';
    }
  

Таким образом, вы должны установить verify_hostname значение 0, чтобы фактически отключить проверку. Смотрите также билет LWP ::Protocol::https отбрасывает значение 0 для SSL_verify_mode.