LWP :: UserAgent更改SSL实现

时间:2018-06-27 22:51:32

标签: perl ssl

我想使用LWP :: UserAgent通过HTTPS发送一些请求。 {{3}}

的ssl_opts部分中有这句话。
  

可以设置其他选项,并由SSL套接字直接处理   使用中的实现。有关详细信息,请参见IO :: Socket :: SSL或Net :: SSL。

我已经在机器上安装了两个模块,因此我认为有些问题。

我如何找出正在使用的模块以及如何将其更改为使用其他模块?

1 个答案:

答案 0 :(得分:1)

  

我如何找出正在使用的那个

如果您查看LWP::UserAgent文档,它说您需要安装LWP::Protocol::https模块以支持https:// URI。

依次查看该模块,您会发现它确实使用了Net::HTTP发行版,您可以在其中找到一个HTTPS.pm模块(在https://metacpan.org/source/OALDERS/Net-HTTP-6.18/lib/Net/HTTPS.pm在线查看该模块),该模块位于首先,您可以清楚地看到,除了被覆盖外,它首先开始尝试使用IO::Socket::SSL,然后仅搜索Net::SSL

请参阅:

elsif ($IO::Socket::SSL::VERSION) {
    $SSL_SOCKET_CLASS = "IO::Socket::SSL"; # it was already loaded
}
elsif ($Net::SSL::VERSION) {
    $SSL_SOCKET_CLASS = "Net::SSL";
}

如果尚未加载它们,它将尝试以相同顺序加载它们:

eval { require IO::Socket::SSL; };
if ($@) {
    my $old_errsv = $@;
    eval {
        require Net::SSL;  # from Crypt-SSLeay
    };
    if ($@) {
        $old_errsv =~ s/\s\(\@INC contains:.*\)/)/g;
        die $old_errsv . $@;
    }
    $SSL_SOCKET_CLASS = "Net::SSL";
}
else {
    $SSL_SOCKET_CLASS = "IO::Socket::SSL";
}

因此,简而言之,IO::Socket::SSL具有完整的优先级。

在程序内部,使用LWP::UserAgent后,您可以使用$Net::HTTPS::SSL_SOCKET_CLASS变量来知道哪个类用于HTTPS操作。

  

如何更改它以使用其他模块?

如果您阅读代码的开头,则会看到:

elsif ($SSL_SOCKET_CLASS = $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS}) {
    unless ($SSL_SOCKET_CLASS =~ /^(IO::Socket::SSL|Net::SSL)\z/) {
        die "Bad socket class [$SSL_SOCKET_CLASS]";
    }
    eval "require $SSL_SOCKET_CLASS";
    die $@ if $@;
}

,这意味着在上述所有内容中,如果环境定义了变量PERL_NET_HTTPS_SSL_SOCKET_CLASS,则如果其名称为IO::Socket::SSLNet::SSL,则将其值用作执行操作的类。

因此,可以在启动使用LWP::UserAgent的程序之前在您的环境中进行设置,或者在程序中执行类似的操作:

BEGIN {
    $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';
}

这需要在之前发生use LWP::UserAgent;