Perl中的证书错误

时间:2016-01-29 05:33:39

标签: perl ssl

我正在连接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

1 个答案:

答案 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会告诉您。