gpt4 book ai didi

perl - Crypt-SSLeay 无法验证主机名

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:10 25 4
gpt4 key购买 nike

我根本不是 Perl 人。但在某些情况下,我必须在新的 gentoo 服务器上部署 perl 脚本。脚本在其他几个由另一个人配置的服务器上运行良好。我自己安装了一台新服务器,某些软件包有不同的版本。作为给定 perl 脚本的结果,我遇到了一个问题:

Net::SSL from Crypt-SSLeay can't verify hostnames; either install IO::Socket::SSL or turn off verification by setting the PERL_LWP_SSL_VERIFY_HOSTNAME environment variable to 0

实际上是安装了。

perl -MIO::Socket::SSL -e 'print "$IO::Socket::SSL::VERSION\n"' 2.024

为什么它看不到已安装的模块。在不修改脚本的情况下,我可以在新服务器上做什么来解决问题?版本差异有那么重要吗?新服务器 Perl 版本:5.24.0旧服务器Perl版本:5.22.1

新服务器:

perl -v

This is perl 5, version 24, subversion 0 (v5.24.0) built for x86_64-linux

perl -MCrypt::SSLeay -e 'print "$Crypt::SSLeay::VERSION\n"'

0.72

perl -MIO::Socket::SSL -e 'print "$IO::Socket::SSL::VERSION\n"'

2.024

env | grep PERL_LWP_SSL_VERIFY_HOSTNAME

Old server: perl -v

This is perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux

network6 ~ # perl -MCrypt::SSLeay -e 'print "$Crypt::SSLeay::VERSION\n"'

0.72

network6 ~ # perl -MIO::Socket::SSL -e 'print "$IO::Socket::SSL::VERSION\n"'

2.012

env | grep PERL_LWP_SSL_VERIFY_HOSTNAME

最佳答案

选择可能会受到程序中完全不相关的部分的影响。我建议在程序顶部附近添加以下内容:

use IO::Socket::SSL;

或者,在启动程序的过程中将 var PERL_NET_HTTPS_SSL_SOCKET_CLASS 设置为 IO::Socket::SSL

export PERL_NET_HTTPS_SSL_SOCKET_CLASS=IO::Socket::SSL
  • 如果您的程序现在抛出异常,这可能就是使用 Net::SSL 的原因。

    解决方案:解决该错误,或​​使用不太安全的 Net::SSL(这需要将环境变量 PERL_LWP_SSL_VERIFY_HOSTNAME 设置为 0)。

  • 如果您的程序现在运行完美,那么 Net::SSL 正在您程序的其他地方加载,这会扭曲决策过程。

    解决方案:继续使用两种解决方案中的一种。


详细版

该消息来自 Net::HTTPS,LWP::Protocol::https 使用它,LWP::UserAgent 和 LWP::Simple(以及 WWW::Mechanize)使用它。

以下是 Net::HTTPS 用来确定使用哪个 SSL 类的过程:

package Net::HTTPS;

use vars qw( $SSL_SOCKET_CLASS );

# Figure out which SSL implementation to use
if ($SSL_SOCKET_CLASS) {
# somebody already set it
}
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 $@;
}
elsif ($IO::Socket::SSL::VERSION) {
$SSL_SOCKET_CLASS = "IO::Socket::SSL"; # it was already loaded
}
elsif ($Net::SSL::VERSION) {
$SSL_SOCKET_CLASS = "Net::SSL";
}
else {
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";
}
}

一般来说,如果安装了 Net::HTTPS,将使用 IO::Socket::SSL,否则将使用 Net::SSL。

一种可能被意外覆盖的方法是在加载 Net::HTTPS 之前加载 Net::SSL (elsif ($Net::SSL::VERSION))。

# Causes the "elsif ($Net::SSL::VERSION)" path to be taken
use Net::SSL;

换句话说,选择会受到程序其他部分的影响。

这可以通过在加载 Net::HTTPS 之前加载 IO::Socket::SSL 来抵消,或者通过将环​​境变量 PERL_NET_HTTPS_SSL_SOCKET_CLASS 设置为 IO::Socket::SSL 在启动程序的过程中。

所以尝试将以下内容添加到程序的顶部:

# Causes the "elsif ($IO::Socket::SSL::VERSION)" path to be taken
use IO::Socket::SSL;

或者尝试在启动程序的过程中执行以下操作:

# Causes the "elsif ([...]$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS})" path to be taken
export PERL_NET_HTTPS_SSL_SOCKET_CLASS=IO::Socket::SSL

关于perl - Crypt-SSLeay 无法验证主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37447962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com