Centos

升級到 Centos 7 後 lwp-request 失敗

  • January 26, 2015

我有一個在 centos 6 上執行良好的 bash 腳本,其中有一個 lwp-request。我將系統升級到 Centos 7,但請求無法執行:

# lwp-request -E https://localhost/admin/startup
GET https://localhost/admin/startup
User-Agent: lwp-request/6.03 libwww-perl/6.05

500 Can't connect to localhost:443
Content-Type: text/plain
Client-Date: Sun, 25 Jan 2015 10:24:22 GMT
Client-Warning: Internal response

Can't connect to localhost:443

我驗證了該網址可通過瀏覽器訪問。

我的假設是這是一個 perl-libraries-update 問題。

使用 lwp-request 的 SSL/TLS 網路需要哪些 perl 庫?

或者這些庫中發生了什麼變化:

perl-libwww-perl
perl-Crypt-SSLeay

注意

在 Centos 7 中,我安裝了這些(以及更多)可能與此相關的新庫:

perl-Net-SSLeay
perl-IO-Socket-SSL

IO::Socket::SSL 驗證證書中的名稱是否與您連接的名稱匹配,但 Crypt::SSLeay 不匹配。預設情況下,較新的 LWP 也會驗證證書鏈,但也許這也是您使用的舊 LWP 版本完成的。

我建議您使用 SSL 調試呼叫您的程序,以查看問題的實際原因:

perl -MIO::Socket::SSL=debug4 program.pl

然後您可以控制ssl_opts應該執行哪些檢查,perldoc IO::Socket::SSL有關選項的更多詳細資訊,請參閱:

  • 如果您使用SSL_ca_file的是自簽名證書,或者該證書不是由任何通常受信任的根 CA 頒發的,請使用此選項。
  • 用於SSL_verifycn_name設置證書中應有的名稱。也就是說,如果您www.example.com在證書中有一個名稱,但連接到localhost您應該設置的主機SSL_verifycn_name => 'www.example.com'
  • 或者,您可以使用SSL_fingerprint僅檢查證書的指紋並禁用任何其他檢查。
  • 最後,您可以使用 禁用任何類型的驗證SSL_verify_mode。但這只是一種解決方法,您永遠不應該在生產程式碼中這樣做,因為這會使您容易受到中間人攻擊。

由於您不能直接設置 ssl_optslwp-request我建議改用一個小程序,即這樣的東西:

 use LWP::UserAgent;
 my $ua = LWP::UserAgent->new( ssl_opts => { 
     SSL_ca_file => 'myca.pem',
     SSL_verifycn_name => 'www.example.com',
 });
 print $ua->get('https://...')->as_string;

引用自:https://unix.stackexchange.com/questions/180952