[英]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.