我可以强制 LWP::UserAgent 接受过期的 SSL 证书吗?

Posted

技术标签:

【中文标题】我可以强制 LWP::UserAgent 接受过期的 SSL 证书吗?【英文标题】:Can I force LWP::UserAgent to accept an expired SSL certificate? 【发布时间】:2010-09-25 02:15:40 【问题描述】:

我想知道是否可以强制 LWP::UserAgent 接受单个知名服务器的过期 SSL 证书。中间的 Squid 代理会使问题稍微复杂化。

我什至设置了一个调试环境,例如:

use warnings;
use strict;
use Carp;
use LWP::UserAgent;
use LWP::Debug qw(+);
use HTTP::Cookies;

my $proxy = 'http://proxy.example.net:8118';
my $cookie_jar = HTTP::Cookies->new( file => 'cookies.tmp' );
my $agent = LWP::UserAgent->new;
$agent->proxy( [ 'http' ], $proxy );
$agent->cookie_jar( $cookie_jar );

$ENVHTTPS_PROXY = $proxy;
$ENVHTTPS_DEBUG = 1;
$ENVHTTPS_VERSION = 3;
$ENVHTTPS_CA_DIR    = '/etc/ssl/certs';
$ENVHTTPS_CA_FILE    = '/etc/ssl/certs/ca-certificates.crt';

$agent->get( 'https://www.example.com/');

exit;

幸运的是,在我想出自己的解决方案之前,问题最终在远程服务器上得到解决,但我希望能够在问题再次出现时有选择地规避问题(基础服务已经中断了好几次)在我被要求采取行动前几个小时)。

如果存在这样的解决方案,我更倾向于 LWP::UserAgent 级别的解决方案,而不是基于底层 Crypt::SSLeay 或 openSSL 实现的解决方案,因为我不希望放松其他不相关应用程序的安全性。当然,我自己仍在寻找这样的解决方案,在我丰富的空闲时间。

【问题讨论】:

【参考方案1】:

更新地址评论

要绕过所有证书检查,您可以将agent 设置为不验证证书。

$agent->ssl_opts(verify_hostname => 0);

代理还将设置向下传递给正在使用的 SSL 套接字实现。例如,使用IO::Socket::SSL,您可以将SSL_verify_mode 设置为0x00

$agent->ssl_opts(SSL_verify_mode => 0x00);

【讨论】:

这有时被引用为解决方案,但在我的情况下似乎不起作用;不过,我没有时间对其进行广泛的测试,而且我很可能错了。我计划在测试环境中验证这是否适合我。 刚刚处理了一些 perl 遗留代码,verify_hostname 设置对我有用,在构造后立即设置,在标头之前等。我不需要设置 SSL_verify_mode。【参考方案2】:

尝试使用

覆盖 SSL 证书验证
$agent->ssl_opts(verify_hostname => 0,
              SSL_verify_mode => 0x00);

在执行 https 请求之前。

【讨论】:

使用 Perl 5.28 在 2.7.3 中为我工作。谢谢。

以上是关于我可以强制 LWP::UserAgent 接受过期的 SSL 证书吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 LWP::UserAgent 是通过 require LWP::UserAgent 而不是使用 LWP::UserAgent 导入的?

Perl LWP::UserAgent 错误处理 UTF-8 响应

LWP::UserAgent介绍2

LWP::UserAgent介绍1

perl LWP::UserAgent获取源码与响应

未通过 https 使用 LWP::UserAgent get() 获取预期内容