我想访问无法验证证书的网站(主机名不正确,我无法更改/更新我的应用程序指向的服务器上的证书)。我正在使用Mojo::UserAgent
来获取请求。那么如何忽略这一点并继续连接到网站?
我看到没有选择。
我不想使用LWP::UserAgent
。
我是使用WWW::Curl
和WWW::Curl::Easy
完成的,但我想使用Mojo::UserAgent
清理代码(在我的整个应用程序中使用)。
答案 0 :(得分:4)
主机名不正确...那么如何忽略这一点并继续连接到网站?
仅仅因为主机名与证书不匹配而放弃任何类型的验证是一个非常糟糕的主意。你为什么一直使用TLS?
更好的方法是预先知道您期望的证书,并验证您是否完全获得此证书。使用选项SSL_fingerprint
可以轻松完成此操作。不幸的是Mojo :: UserAgent没有提供设置连接特定参数的方法,因此您需要在连接之前立即设置它,然后在进行其他连接之前将其设置为:
use IO::Socket::SSL 1.980;
IO::Socket::SSL::set_client_defaults(
SSL_fingerprint => "sha256$55a5dfaaf..."
);
... use Mojo::UserAgent to connect ..
IO::Socket::SSL::set_client_defaults(); # set back
有关使用此选项以及如何获取指纹的详细信息,请参阅Certificate error in Perl。
只有主机名不好的另一种方法是使用SSL_verifycn_name
选项指定证书中预期的主机名。
IO::Socket::SSL::set_client_defaults(
SSL_verifycn_name => 'foo.example.com',
);
使用set_args_filter_hack
函数可以完成另一种方法,该函数用于处理设置奇怪默认值或不允许用户设置自己值的模块:
my $hostname = undef;
IO::Socket::SSL::set_args_filter_hack(
sub {
my ($is_server,$args) = @_;
$args->{SSL_verifycn_name} = $hostname if $hostname;
}
);
...
$hostname = 'foo.example.com';
... do something with Mojo::UserAgent ...
$hostname = undef;
这样您就可以调整每次SSL握手的设置。
有关详细信息,请参阅documentation of IO::Socket::SSL,尤其是有关常见用法错误的部分。这部分还记录了您应该做什么,而不是在证书的某些部分出错时禁用任何类型的验证。
'SSL connect attempt failed error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol' curl ... SSL connection using TLS_RSA_WITH_RC4_128_MD5
我的猜测是你在这里面临的与证书验证无关。鉴于此服务器使用的是非常旧的密码RC4-MD5,我将假设服务器只能处理SSL 3.0。出于安全原因,此版本在IO :: Socket :: SSL中暂停一段时间。要暂时明确地使用这个不安全的版本:
IO::Socket::SSL::set_client_defaults(
SSL_version => 'SSLv3'
);
答案 1 :(得分:1)
这是一个古老的问题,但 Mojolicious 还活着。因此,我最近一直在与这个作斗争。直接从文档:
my $bool = $ua->insecure;
$ua = $ua->insecure($bool);
访问 HTTPS/WSS 站点不需要有效的 TLS 证书,默认为 MOJO_INSECURE 环境变量的值。
# Disable TLS certificate verification for testing
say $ua->insecure(1)->get('https://127.0.0.1:3000')->result->code;
在我的应用程序中,$bool
是通过配置文件设置的,因此我可以在需要的地方重新打开它。
答案 2 :(得分:-2)
Mojo :: UserAgent使用IO :: Socket :: SSL进行SSL / TLS支持,因此您可以使用
禁用服务器证书验证IO::Socket::SSL::set_defaults(
SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE,
);