我根本不是Perl的人。但是对于环境,我必须在新的gentoo服务器上部署perl脚本。脚本在其他人配置的其他几台服务器上运行良好。所以我自己安装了新的服务器,并为某些软件包提供了不同的版本。由于给定的perl脚本,我有一个问题:
来自Crypt-SSLeay的Net :: SSL无法验证主机名;安装IO :: Socket :: SSL或通过将PERL_LWP_SSL_VERIFY_HOSTNAME环境变量设置为0来关闭验证
实际上已安装。
perl -MIO :: Socket :: SSL -e' print" $ IO :: Socket :: SSL :: VERSION \ n"' 2.024
为什么它看不到已安装的模块。如果没有修改脚本,我可以在新服务器上修复问题?版本差异如此重要吗? 新服务器Perl版本:5.24.0 旧服务器Perl版本:5.22.1
新服务器:
perl -v
这是为x86_64-linux构建的perl 5,版本24,颠覆0(v5.24.0)
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
旧服务器: perl -v
这是为x86_64-linux构建的perl 5,版本22,subversion 1(v5.22.1)
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
答案 0 :(得分:3)
选择可能会受到程序中完全不相关的部分的影响。我建议在程序顶部附近添加以下内容:
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(需要将env var 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(elsif ($Net::SSL::VERSION)
)之前加载Net :: SSL。
# Causes the "elsif ($Net::SSL::VERSION)" path to be taken
use Net::SSL;
换句话说,选择可能会受到程序其他部分的影响。
这可以通过在加载Net :: HTTPS之前加载IO :: Socket :: SSL,或者在启动程序的过程中将env var 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