升级到 Centos 7 后 lwp-request 失败

升级到 Centos 7 后 lwp-request 失败

我有一个在 centos 6 上运行良好的 bash 脚本,其中有一个 lwp-request 。我将系统升级到Centos 7,请求无法运行:

# lwp-request -E https://localhost/admin/startup
GET https://localhost/admin/startup
User-Agent: lwp-request/6.03 libwww-perl/6.05

500 Can't connect to localhost:443
Content-Type: text/plain
Client-Date: Sun, 25 Jan 2015 10:24:22 GMT
Client-Warning: Internal response

Can't connect to localhost:443

我验证了该网址可以通过浏览器访问。
我的假设是这是一个 perl-libraries-update 问题。
使用 lwp-request 的 SSL/TLS 网络需要哪些 perl 库?
或者这些库中发生了什么变化:

perl-libwww-perl
perl-Crypt-SSLeay

注意
在 Centos 7 中,我安装了这些(以及更多)新库,它们可能与此相关:

perl-Net-SSLeay
perl-IO-Socket-SSL

答案1

IO::Socket::SSL 验证证书中的名称是否与您连接到的名称匹配,但 Crypt::SSLeay 则不然。默认情况下,较新的 LWP 也会验证证书链,但也许您使用的旧 LWP 版本也可以这样做。

我建议您使用 SSL 调试来调用您的程序,以查看问题的实际原因:

perl -MIO::Socket::SSL=debug4 program.pl

然后您可以控制ssl_opts应执行哪些检查,请参阅perldoc IO::Socket::SSL有关选项的更多详细信息:

  • SSL_ca_file如果您使用自签名证书或该证书不是由任何普遍信任的根 CA 颁发的,请使用。
  • 用于SSL_verifycn_name设置证书中应包含的名称。也就是说,如果您www.example.com在证书中有一个名称,但连接到localhost您应该设置的主机SSL_verifycn_name => 'www.example.com'
  • 或者,您可以SSL_fingerprint仅检查证书的指纹并禁用任何其他检查。
  • 最后,您可以使用 禁用任何类型的验证SSL_verify_mode。但这只是一种解决方法,您永远不应该在生产代码中执行此操作,因为这会使您容易遭受中间人攻击。

由于您无法直接设置 ssl_optslwp-request我建议使用一个小程序,即如下所示:

  use LWP::UserAgent;
  my $ua = LWP::UserAgent->new( ssl_opts => { 
      SSL_ca_file => 'myca.pem',
      SSL_verifycn_name => 'www.example.com',
  });
  print $ua->get('https://...')->as_string;

相关内容