【问题标题】:LWP::UserAgent Insists on verifying hostnameLWP::UserAgent 坚持验证主机名
【发布时间】:2014-07-29 11:27:41
【问题描述】:

以下脚本可以在运行libwww-perl-5.836 的主机上返回一个全面的标头,但在使用libwww-perl-6.30.0 的主机上则不返回。在这种情况下,脚本会显示以下内容:

    500 Can't connect to backend.mutegroup.org:443 (certificate verify failed)
    Content-Type: text/plain
    Client-Date: Mon, 28 Jul 2014 21:09:28 GMT
    Client-Warning: Internal response

    Can't connect to backend.mutegroup.org:443 (certificate verify failed)

    LWP::Protocol::https::Socket: SSL connect attempt failed with unknown error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/lib64/perl5/vendor_perl/5.16.3/LWP/Protocol/http.pm line 51.

这是脚本:

#!/usr/bin/perl

use strict;
use warnings;

use LWP::UserAgent;
use HTTP::Request::Common;

my $ua      = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0, } );
my $url     = 'https://backend.mutegroup.org/api/getLastId';

my $request = POST $url;
print $ua->request($request)->as_string

libwww-perl-5.837 和之前的主机名默认不验证。这就解释了为什么它可以在旧主机上运行。但是,我明确禁用检查,它仍然坚持这样做。

这是在 Gentoo 系统上。

【问题讨论】:

  • @oalders,这解释了为什么旧主机正在工作。谢谢。我已根据此信息更新了问题。但是,我明确关闭了主机名检查,但问题仍然存在。

标签: perl http lwp-useragent


【解决方案1】:

您已关闭验证主机名;您尚未关闭验证证书。

verify_hostname 控制“LWP 是否将用于安全协议方案确保它连接到具有有效证书的服务器与预期的主机名匹配”(我的重点)。将其设置为 0 允许您连接到具有有效证书但未为您尝试访问的主机/主机名颁发的服务器。

要关闭检查证书是否有效(由受信任的 CA 颁发),您需要:

use IO::Socket::SSL;

my $ua = LWP::UserAgent->new(
   ssl_opts => {
      verify_hostname => 0,
      SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE,
   },
);

请注意,如果您要传输任何敏感信息或希望信任返回的数据,那么关闭其中任何一个选项都是一个坏主意。如果关闭其中任何一个,您将失去 SSL 的优势,并且容易受到各种中间人攻击。

【讨论】:

  • 当您发布此内容时,我正在提交自己的答案。你的更全面,所以我会删除我的并接受你的。您可以在答案中的某处添加use IO::Socket::SSL;(为了完整性)吗?
  • 我注意到等效配置也需要设置为环境变量,例如:$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
  • 我有一个带有 perl 5.14.2 的旧系统,其中 WebInject 监控任务突然失败。设置 verify_hostname = 0 有助于解决问题,直到我们可以更新系统。谢谢。
猜你喜欢
  • 2022-01-01
  • 2012-01-02
  • 2012-10-30
  • 2011-09-24
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多