Centos
升級到 Centos 7 後 lwp-request 失敗
我有一個在 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_opts
lwp-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;