2016-03-15 87 views
0

運行正常兩年的perl腳本在回發IPN消息時剛剛開始返回「500 SSL握手失敗」錯誤。我的主機服務支持SHA 256,TLS 1.2和HTTP/1.1。我正在使用我的主機服務的共享證書。 代碼(來自PayPal的示例腳本):Perl PayPal IPN偵聽器返回「500 SSL握手失敗」消息

# read post from PayPal system and add 'cmd' 
read (STDIN, $query, $ENV{'CONTENT_LENGTH'}); 
$query .= '&cmd=_notify-validate'; 

# post back to PayPal system to validate 
$ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 1 }); 
$req = HTTP::Request->new('POST', 'https://www.sandbox.paypal.com/cgi-bin/webscr'); 
$req->content_type('application/x-www-form-urlencoded'); 
$req->header(Host => 'www.sandbox.paypal.com'); 
$req->content($query); 
$res = $ua->request($req); 

if ($res->is_error) { 
# HTTP error 
$retmsg = "HTTP Error:<br />"; 
$retmsg .= $res->status_line(); 
} 

...

我最好如何解決呢?

+0

很難說沒有更多的細節,但我的猜測是,你使用的是舊版本的LWP/IO :: Socket :: SSL或OpenSSL。在這種情況下,你的服務器支持的並不重要。請添加libs的版本:'perl -MLWP :: UserAgent -MIO :: Socket :: SSL -e'printf'openssl =%x \ nio-ssl =%s \ nlwp =%s \ nperl =%s \ n「,Net :: SSLeay :: OPENSSL_VERSION_NUMBER(),IO :: Socket :: SSL-> VERSION,LWP :: UserAgent-> VERSION,$^V'' –

+0

@Steffen非常感謝您的建議。當我執行此命令時,在E-E行之前的任何位置收到消息「無法找到字符串終止符」。「我看不到任何語法問題。我錯過了什麼? – VanScott

+0

無論出於何種原因剪切+粘貼似乎都會添加一些奇怪的字符。嘗試使用http://pastebin.com/gqjcCvsT –

回答

1

根據SSLLabs該網站只有TLS 1.2,它不接受TLS 1.0或TLS 1.1。根據您的評論,您正在使用OpenSSL版本1.0.0e(1000005f)。但是這個版本不支持TLS 1.2,因爲這種支持只是在版本1.0.1中添加的。

這意味着您的系統太舊而無法支持TLS 1.2。您至少需要升級OpenSSL版本,但最好是整個系統。請注意,它僅僅安裝新版本的OpenSSL並無幫助。相反,您需要重新編譯所有使用該庫的Perl模塊,即在這種情況下特別是Net :: SSLeay。

+0

謝謝斯蒂芬,你的時間和advice.With的理解,這是一個 「關鍵任務」 應用對於我的客戶,我需要找到一些解決方案。找到一個提供支持TLS 1.2(如果存在這樣的主機)的最新模塊庫並且遷移系統或者花費時間的Web主機,就像你所建議的那樣,重新編譯必要的模塊和在當地圖書館中引用它們。 – VanScott

+0

我沒有編譯Perl模塊的經驗,但我肯定願意學習 - 我只關心學習曲線所需的時間,因爲PayPal計劃很快在生產環境中進行這些更改。 順便提一下,我的主機提供商iPower對更新其庫中的Perl模塊並不感興趣,即使已經指出其中一些不符合新的安全標準。 – VanScott

+0

@VanScott:如果您僅使用共享主機,我懷疑自己可能會升級到較新的OpenSSL版本。如果您的主機不願意這樣做,您可能需要更改。我無法給你任何提供所需支持的建議,但任何提供最新軟件的主機都應該擁有它,因爲必要的OpenSSL 1.0.1版已在大約4年前發佈。 –