2017-02-17 121 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是可公开访问的,那么在调试问题时也会有所帮助。