簡體   English   中英

升級 LWP “證書驗證失敗”后腳本中斷

[英]Scripts broke after upgrading LWP "certificate verify failed"

我有很多腳本,其中大多數基於WWW::Mechanize ,它從可通過 HTTPs 訪問的雜項硬件中刮取數據。 升級我的大部分 perl 安裝及其模塊后,所有使用 HTTPS:// 的腳本都因"certificate verify failed"而中斷

這是因為較新版本的 LWP 對證書進行了適當的檢查,如果不匹配dies

就我而言,由於這種情況,預計證書身份驗證會失敗,因此我需要找到一種徹底規避此檢查的方法。

假設我想告訴你一些事情,我不想讓其他人知道。 我們會安排一個密碼,我會用它來加密消息,然后我會將消息發送給你。

如果我不能確定向我提供密碼和加密信息的人是你怎么辦? 那么任何數量的人都可以簡單地冒充您,而加密將是徒勞的。 直到最近,這還是 LWP 的 HTTPS 支持狀態。

現在,LWP 實際上會檢查它正在與誰交談,除非您要求 LWP 像以前那樣行事。 你可以這樣做:

my $ua = LWP::UserAgent->new(
   ssl_opts => { verify_hostname => 0 },
);

如果您想影響腳本中的所有 LWP::UserAgent 實例而不在整個地方指定選項,您可以將以下內容添加到您的腳本中

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

或者您可以按如下方式啟動您的腳本:

PERL_LWP_SSL_VERIFY_HOSTNAME=0 script.pl

最后,如果您希望 LWP 始終不安全,您可以將以下內容添加到您的登錄腳本中:

export PERL_LWP_SSL_VERIFY_HOSTNAME=0

但是,我不推薦以上任何一種 更好的選擇是為您正在與之通信的主機提供證書。 (這相當於在 Firefox 中添加異常,如果您知道我的意思的話。)請參閱$ua->ssl_opts文檔

對我來說,使用:

my $ua = LWP::UserAgent->new(
  ssl_opts => { verify_hostname => 0 },
);

產量

不推薦對客戶端使用 SSL_VERIFY_NONE 的 SSL_verify_mode 的默認值! 請將 SSL_verify_mode 設置為 SSL_VERIFY_PEER 以及 SSL_ca_file|SSL_ca_path 以進行驗證。 如果您真的不想驗證證書並保持連接對中間人攻擊開放,請在您的應用程序中將 SSL_verify_mode 顯式設置為 SSL_VERIFY_NONE。

使用它沒有給出任何警告:

my $ua = LWP::UserAgent->new(
  ssl_opts => { SSL_verify_mode => 'SSL_VERIFY_NONE'},
);

我在我的代碼前面加上:

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;

這導致腳本以干凈簡單的方式繞過檢查。

@ikegami 為您為什么不想禁用 SSL 主機名驗證提供了一個很好的論據,但沒有直接提及如何避免它。

如果您使用 CA 簽名證書與公共系統通信,則需要將 LWP 指向您的發行版的根證書集合。 在基於 Debian 的系統(Ubuntu 等)下,它保存在/etc/ssl/certs/下。

BEGIN {
    $ENV{HTTPS_CA_DIR} = '/etc/ssl/certs'
}

如果您使用自簽名證書與自己的服務器通信,則可以在客戶端上保存該證書的副本,並將腳本指向該特定文件。

BEGIN {
    $ENV{HTTPS_CA_FILE} = '/path/to/my/server-certificate.crt'
}

您可以在運行腳本之前在環境中設置這些(例如,從您的 shell 中導出它們),或者您可以將設置直接應用到您的 UserAgent 對象。 有關詳細信息,請參閱LWP::UserAgent 文檔 搜索ssl_opts (大約在頁面的中間)。

在頂部添加庫,並在使用 LWP 模塊功能之前添加其余的 ENV 聲明和 IO 套接字信息。 然后嘗試,它會鍛煉。

use IO::Socket::SSL;
use LWP::UserAgent;

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
$ENV{HTTPS_DEBUG} = 1;
        
IO::Socket::SSL::set_ctx_defaults(
  SSL_verifycn_scheme => 'www',
  SSL_verify_mode => 0,
);

$ua = LWP::UserAgent->new();

暫無
暫無

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

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