Crypt-SSLeay无法验证主机名

时间:2016-05-25 21:31:37

标签: perl ssl gentoo

我根本不是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

1 个答案:

答案 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