7

我在连接 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 '打印“LWP 版本:$LWP::VERSION\n”'

LWP 版本:6.04

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

地穴::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 '打印“LWP 版本:$LWP::VERSION\n”'

LWP 版本:6.04

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

地穴::SSLeay 版本:0.64

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

lwp-request https:///sdk/webService Can't connect to :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 工作正常。如果您获得最新更新,则它将停止工作。所以还不确定哪个库导致了这个问题。

4

5 回答 5

5

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

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

于 2013-11-05T12:41:18.640 回答
4

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

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

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

于 2015-10-15T08:42:31.627 回答
2

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

SetEnv PERL_LWP_SSL_VERIFY_HOSTNAME 0

或者

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
于 2014-09-25T07:46:29.830 回答
2

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

于 2013-07-19T23:19:43.873 回答
-2

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

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

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

于 2014-11-26T21:48:02.037 回答