我正在连接CAS服务器。但我的CAS服务器证书已过期,由于此错误:
error SSL connect attempt failed error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed unable to connect https://<domain Name>:443/
为避免此错误,几乎没有建议像verify_hostname&amp; verify_ssl到&#34; 0&#34;。但它没有解决问题。有人可以帮忙吗?
Perl版本:5.22
LWP:6.0.16
答案 0 :(得分:2)
为避免此错误,几乎没有建议像verify_hostname&amp; verify_ssl到&#34; 0&#34;
如果您遵循这些建议,那么您应该问问自己为什么要使用https。因为忽略证书错误意味着中间人攻击是可能的,因此TLS提供的保护就会消失。
要连接到无法通过正常方式正确验证证书的服务器,您必须使用其他类型的验证,而不是根本不验证。使用IO::Socket::SSL实现对当前版本LWP中的https的支持。该模块提供了一种简单的机制来处理这些问题,方法是将证书的指纹与预期的指纹进行比较。
首先,您需要获取证书的当前指纹。这可以通过一些openssl
命令来完成,或者如果您确定当前没有人在中间攻击中,您只需访问服务器:
use strict;
use warnings;
use IO::Socket::SSL 1.980;
my $dst = 'bad-cert.example.com';
my $cl = IO::Socket::SSL->new(
PeerAddr => $dst,
PeerPort => 443,
# certificate cannot be validated the normal way, so we need to
# disable validation this one time in the hope that there is
# currently no man in the middle attack
SSL_verify_mode => 0,
) or die "connect failed";
my $fp = $cl->get_fingerprint;
print "fingerprint: $fp\n";
这将为您提供带有哈希算法的指纹,例如sha256$55a5dfaaf...
。然后,此指纹可用于在将来的呼叫中验证证书:
use strict;
use warnings;
use IO::Socket::SSL 1.980;
use LWP::UserAgent;
my $dst = ....; # from above example
my $fp = ....; # from above example
my $ua = LWP::UserAgent->new(ssl_opts => { SSL_fingerprint => $fp });
my $resp = $ua->get("https://$dst");
print $resp->content;
除此之外,请注意证书有效期到期。在到期时间之后,将不再跟踪撤销。这意味着您必须确实知道此证书绝对不会被撤销,因为没有CA会告诉您。