2013-11-01 88 views
0
my $ua = LWP::UserAgent->new(); 
my $res = $ua->get("https://url"); 
print $res->content; 

導致了迴應,該證書是無效的(如果我禁用主機名驗證服務器會說我需要加密代替),直到我開始使用Net::SSLPerl的LWP :: UserAgent的特定服務器上失敗的SSL

$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL'; 

在做我的請求之前,ofc。

模塊版本此刻:

Crypt::SSLeay 0.58 
IO::Socket::SSL 1.955 
Net::SSLeay 1.55 
LWP 6.05 
LWP::Protocol::https 6.04 

也嘗試了最新Crypt::SSLeay但還是失敗了(在測試環境中嘗試這樣做)。

這僅僅是在客戶端和服務器之間的Crypt::SSLeay庫中的限制 - 他們可能不同意加密方法?

我也使用OpenSSL來手動連接到有問題的服務器,它工作沒有問題,沒有證書失敗等等。

我的問題已經解決了,但不是以一種非常優美的方式,但我很好奇錯誤在哪裏,因爲我花了很多時間尋找解決方案,並且問題的根源。我向其他成百上千個其他服務器發送SSL請求,但沒有這個問題,但是這臺服務器只會回覆一條消息,說我需要加密我的請求。

是否LWP連同Net:SSL更支持?

您將如何嘗試追蹤問題的根源?

編輯:一個有趣的事情是,這並沒有發生在舊版本的模塊(它最近工作)。我強烈懷疑這是LWP或更新的東西。怪異的行爲如何在更新中像這樣改變。

+0

Net :: HTTP的版本?更新這個庫已經打破並且固定了很多安裝,取決於它是什麼版本。 – runrig

+0

你是指你運行你的腳本的服務器,還是你請求URL的服務器? – runrig

+0

Net :: HTTP 6.06,上面列出的版本位於我發送請求的服務器上。它曾經工作到同一臺服務器,但某些模塊更新了依賴關係(我認爲),然後停止工作。 – Gauntlet

回答

0

某些服務器不支持TLSv1.2。默認情況下,LWP將連接到某些服務器,但不連接到那些需要較低TLS版本的服務器。我通過https與LWP 6.0x有一個非常通用的500錯誤,並將LWP :: UserAgent設置爲SSL_version =>'TLSv1'不適用於我。嘗試強制LWP僅使用IO :: Socket :: SSL並強制TLS版本進行其他測試。

LWP::UserAgent Can't Post with TLS1.1

1

如果它說,該證書是無效的,它可能無法驗證它,因爲它是自簽名時,CA不知道或類似的問題。如果我理解你的話,它只會在這個特定的服務器上失敗,所以它的證書可能有問題。如果您使用瀏覽器也收到錯誤消息,請檢查。 如果我知道確切的網址並可以訪問,可能會提供更多幫助。

至於Net :: SSL與IO :: Socket :: SSL:最近的LWP版本默認使用IO :: Socket :: SSL(基於Net :: SSLeay)而不是舊的Net :: SSL/Crypt :: SSLeay,因爲IO :: Socket :: SSL具有更多功能,更正確的證書驗證並處於積極的開發階段。

Steffen(IO :: Socket :: SSL的當前維護者/開發者)

+0

瀏覽器訪問頁面並驗證證書沒有問題,我試過Chrome,FF和IE。另外 - 它不是自簽名的。 CA也是已知的(使用'dig'手動檢查證書,使用系統上的標準已知CA:s不會發生錯誤)。 – Gauntlet

+0

發送一封電子郵件給您,因爲我不想在這裏透露它。如果你發現可能的原因,請在stackexchange上分享,以便我和其他人可以學習。 – Gauntlet

相關問題