簡體   English   中英

Perl中的證書錯誤

[英]Certificate error in Perl

我正在連接到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”和“ verify_ssl”設置為“ 0”。 但這並不能解決問題。 有人可以幫忙嗎?

Perl版本:5.22
LWP:6.0.16

為避免此錯誤,很少有建議,例如verify_hostname和verify_ssl為“ 0”

如果您遵循這些建議,那么您應該問自己為什么要使用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會告訴您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM