【问题标题】:PERL_LWP_SSL_VERIFY_HOSTNAME setting to 0 is not workingPERL_LWP_SSL_VERIFY_HOSTNAME 设置为 0 不起作用
【发布时间】:2013-07-19 08:52:45
【问题描述】:

在连接 Ubuntu 机器时遇到问题,而我的另一台机器工作正常。两者之间的区别在于 Ubuntu 版本和 SSLeay 版本,但我无法缩小问题的范围。

我已经做了以下事情: a) 添加环境变量:PERL_LWP_SSL_VERIFY_HOSTNAME,值为 0 b) 添加 $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;到 VICommon.pm 文件

以上两个都不起作用。我不知道为什么它不能在我的第二台机器上工作。

Ubuntu 12.10(工程)

$perl /usr/lib/vmware-vcli/apps/general/connect.pl --url https:///sdk/webService --username --password

连接成功

服务器时间:2013-07-19T22:11:31.681181Z

$ perl -v

这是为 x86_64-linux-gnu-thread-multi 构建的 perl 5,版本 14,subversion 2 (v5.14.2)

$ perl -MLWP -e 'print "LWP 版本:$LWP::VERSION\n"'

LWP 版本:6.04

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

Crypt::SSLeay 版本:0.58

Ubuntu 13.04(不工作)

$perl /usr/lib/vmware-vcli/apps/general/connect.pl --url https:///sdk/webService --username --password

服务器版本在 /usr/share/perl/5.14/VMware/VICommon.pm 第 548 行的“https:///sdk/vimService.wsdl”中不可用。

$ perl -v

这是为 x86_64-linux-gnu-thread-multi 构建的 perl 5,版本 14,subversion 2 (v5.14.2)

$ perl -MLWP -e 'print "LWP 版本:$LWP::VERSION\n"'

LWP 版本:6.04

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

Crypt::SSLeay 版本:0.64

证书错误(两台机器相同)

lwp 请求 https:///sdk/webService 无法连接:443(证书验证失败)

LWP::Protocol::https::Socket:SSL 连接尝试失败,出现未知错误错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证在 /usr/share/perl5/LWP/Protocol/http.pm 第 51 行失败.

更新 1

看起来这个问题与 Ubuntu 版本无关,但是当我在 12.10 机器上执行“apt-get upgrade”时获得的新软件包我没有这样做并且它正在工作。然而,在 13.04 上,我最终完成了所有更新。现在,自从我收到超过 80 次更新以来,我仍然没有缩小到把它搞砸的图书馆。当我安装新的 13.04 映像时,它工作正常。

** 更新 2 **

看起来基本的 Ubuntu 12.10 或 13.04 工作正常。如果您获得最新更新,则它将停止工作。所以还不确定是哪个库导致了这个问题。

【问题讨论】:

  • 是什么让您如此确定这与证书检查失败有关?通常,当证书检查失败时,Perl SSL 库会发出警告,但您似乎没有收到任何警告。你可以使用 lwp-request 从两台机器连接吗?
  • 我在两台机器上都遇到了相同的证书失败:lwp-request https:///sdk/webService 无法连接到 :443(证书验证失败)LWP:: Protocol::https::Socket:SSL 连接尝试失败,出现未知错误错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证在 /usr/share/perl5/LWP/Protocol/http.pm 第 51 行失败。
  • 请注意,Crypt::SSLeay 不再是在 Perl 中处理 SSL 的首选方式。在bug tracker 中对此进行了长时间的讨论。

标签: perl ssl vmware cpan lwp


【解决方案1】:

我也遇到过同样的问题 - 我通过键入“use Net::SSL;”解决了它在请求之前。

还试图找出导致问题的库,因为它肯定是导致它的升级模块。虽然大多数网站都可以,但一个网站的证书无法验证。

【讨论】:

  • 对我来说效果很好。正在将脚本从 RHEL (v5.16.3) 移动到 SLES (perl v5.26.1),并且存在不会忽略自签名证书的问题。出于某种原因,CA 签名仍然有效。然而,这个解决了这个问题。
【解决方案2】:

您可以通过以下方式实现更可预测的行为,而不是很快在您的代码中使用use Net::SSL;

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

现在PERL_LWP_SSL_VERIFY_HOSTNAME 设置为零将按预期工作。但是更改底层实现模块不应被视为解决方案,而应被视为 hack。

【讨论】:

    【解决方案3】:

    它还可以取决于 Net::HTTPS 的版本,以及是否安装了 IO::Socket::SSL。 Net::HTTPS 将更喜欢 IO::Socket::SSL(使用 Net::SSLeay)而不是 Net::SSL(使用 Crypt::SSL)。最新版本的 Net::HTTPS 改进了它与 IO::Socket::SSL 的工作方式。

    【讨论】:

    • 我是新手,你能详细说明我如何检查你提到的那些是否启用。
    • 发出 https 请求。如有必要,请评估它,以免它死亡。然后print "$_: $INC{$_}\n" for sort keys %INC; 看看加载了哪些库。
    【解决方案4】:

    您可以尝试添加全局 ENV 变量或通过 Apache 配置进行设置(如果您使用的是 Apache)

    SetEnv PERL_LWP_SSL_VERIFY_HOSTNAME 0
    

    $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
    

    【讨论】:

      【解决方案5】:

      PERL_LWP_SSL_VERIFY_HOSTNAME env var 设置为 0 将禁用重要的安全检查

      将相关模块升级到最新版本(截至 2014 年 11 月)解决了我的问题。

      (在我的例子中,我更新了这些发行版:Crypt-SSLeay-0.72、Net-HTTP-6.07、libwww-perl-6.08 LWP-Protocol-https-6.06。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-09
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多