主机名不正确......那么如何忽略这一点并继续连接到网站?
仅仅因为主机名与证书不匹配就放弃任何类型的验证是一个非常糟糕的主意。为什么要使用 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'
);