2017-02-17 137 views
0

我正在嘗試使用SSL調用Web服務。它給出了以下錯誤:Perl Web服務SSL協商失敗

500 SSL negotiation failed:

我搜索論壇和應用提供的方法,但他們都沒有工作。

2的方法予施加列舉如下:呼叫之前

1-)設定環境:

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

2-)使參數ssl_opts => [SSL_verify_mode => 0]到代理:

my $soap = SOAP::Lite  
    -> on_action(....) 
    -> uri($uri) 
    -> proxy($proxy, ssl_opts => [ SSL_verify_mode => 0 ])  
    -> ns("http://schemas.xmlsoap.org/soap/envelope/","soapenv") 
    -> ns("http://tempuri.org/","tem"); 
$soap->serializer()->encodingStyle(undef); 

有沒有解決方案?

+0

請用'perl -MIO :: Socket :: SSL = debug4 program.pl'運行你的代碼,並將輸出添加到你的問題中,因爲它可能包含可能對調試問題有用的信息。除此之外,ssl_opts可能應該是一個哈希引用,而不是像你的情況那樣的數組引用。 –

+0

如果使用'openssl s_client -connect host:port'連接到給定服務器會發生什麼? – jcaron

+0

另外,你引用的錯誤結尾處的冒號導致我相信在那之後還有更多,不是嗎? – jcaron

回答

3

... Connection reset by peer at /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/Net‌​/SSL.pm line 145

您一起被老版本的SSL庫(即地穴:: SSLeay的,而不是IO ::插座:: SSL)的運行很舊版本的Perl(2004年)和我的猜測是,這與使用非常舊版本的OpenSSL庫進行TLS支持一起使用。這種組合意味着不支持SNI,不支持TLS 1.2並且不支持ECDHE密碼。許多現代服務器至少需要支持其中的一種。但connection reset by peer也可能意味着某些防火牆阻止了連接,或者在您指定的端點上沒有監聽服務器。或者這可能意味着服務器期望您使用客戶端證書進行授權。很難說,但是對於連接的數據包捕獲可以提供更多的信息。而且,如果URL是可公開訪問的,那麼在調試問題時也會有所幫助。