![](/img/trans.png)
[英]Mojo::UserAgent fails to verify certificate, where LWP::UserAgent succeeds
[英]Mojo::UserAgent certificate verify failed
我想訪問一個無法驗證證書的網站(主機名不正確,我無法更改/更新我的應用程序指向的服務器上的證書)。 我正在使用Mojo::UserAgent
來獲取請求。 那么如何忽略這一點並繼續連接到該網站呢? 我已經看到沒有選擇。
我不想使用LWP::UserAgent
。
我已經使用WWW::Curl
和WWW::Curl::Easy
完成了它,但我想使用Mojo::UserAgent
(在我的整個應用程序中使用)清理代碼。
主機名不正確......那么如何忽略這一點並繼續連接到網站?
僅僅因為主機名與證書不匹配而放棄任何類型的驗證是一個非常糟糕的主意。 你為什么要使用 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
有關使用此選項以及如何獲取指紋的更多信息,請參閱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 握手的設置。
更多信息請參見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'
);
Mojo::UserAgent 使用 IO::Socket::SSL 來支持 SSL/TLS,因此您可以使用以下命令禁用服務器證書驗證
IO::Socket::SSL::set_defaults(
SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE,
);
這是一個古老的問題,但 Mojolicious 還活着並且在踢。 因此,我最近一直在與這個作斗爭。 直接從文檔:
my $bool = $ua->insecure;
$ua = $ua->insecure($bool);
不需要有效的 TLS 證書來訪問 HTTPS/WSS 站點,默認為 MOJO_INSECURE 環境變量的值。
# Disable TLS certificate verification for testing
say $ua->insecure(1)->get('https://127.0.0.1:3000')->result->code;
在我的應用程序中, $bool
是從配置文件設置的,因此我可以在需要的地方重新打開它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.