首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl:无法使用SSL访问Web服务

Perl:无法使用SSL访问Web服务
EN

Stack Overflow用户
提问于 2013-02-12 18:18:28
回答 8查看 11.7K关注 0票数 3

这是我的第一个Perl脚本。我已经使用CPAN安装了SOAP::Lite,而且它看起来还不错。

我正在尝试访问一个简单的HelloWorld .NET web服务。我收到一个似乎与Perl或SOAP::Lite有关的错误,无法验证SSL证书。

虽然看起来它返回的代码是500,但我创建了一个Java客户端,它能够很好地调用web方法,所以我不认为问题在web服务端。

有人能为我指出正确的方向吗?我怎样才能做到这一点?

剧本:

代码语言:javascript
运行
复制
#!/usr/bin/perl

use SOAP::Lite 'trace', 'debug';

$api_ns = "https://www.mydomain.com/edgedev/";
$api_url = "https://www.mydomain.com/edgedev/ws.asmx";
$action = "HelloWorld";

my $soap = SOAP::Lite
                -> readable(1)
                -> ns($api_ns, 'tns')
                -> proxy($api_url)
                -> on_action(sub { return "\"$action\""});

print $soap->HelloWorld()->result;

结果

代码语言:javascript
运行
复制
<soap:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:tns="https://www.mydomain.com/edgedev/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <tns:HelloWorld xsi:nil="true" />
      </soap:Body>
</soap:Envelope>
SOAP::Transport::HTTP::Client::send_receive: 500 Can't connect to www.mydomain.com:443 (certificate verify failed)
Content-Type: text/plain
Client-Date: Tue, 12 Feb 2013 16:40:28 GMT
Client-Warning: Internal response

Can't connect to www.mydomain.com:443 (certificate verify failed)

You can disable hostname check by setting environment variable PERL_LWP_SSL_VERIFY_HOSTNAME=0

LWP::Protocol::https::Socket: SSL connect attempt failed with unknown errorerror:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/lib/perl5/vendor_perl/5.10.0/LWP/Protocol/http.pm line 57.
500 Can't connect to www.mydomain.com:443 (certificate verify failed) at ./soaptest.pl line 15
EN

回答 8

Stack Overflow用户

发布于 2015-01-09 20:51:20

下面是如何使此工作安全,即不禁用SSL主机名检查。

如果您正在与具有CA签名证书的公共系统进行交谈,则需要将LWP指向您的发行版的根证书集合。在基于Debian的系统(Ubuntu等)下,这是在/etc/ssl/certs/下进行的。

代码语言:javascript
运行
复制
BEGIN {
    $ENV{HTTPS_CA_DIR} = '/etc/ssl/certs'
}

如果您正在使用自签名证书与自己的服务器对话,则可以在客户端上保存该证书的副本,并将脚本指向该特定文件。

代码语言:javascript
运行
复制
BEGIN {
    $ENV{HTTPS_CA_FILE} = '/path/to/my/server-certificate.crt'
}

相反,您可以在运行脚本之前在环境中设置这些设置(例如,从shell导出它们),或者可以将设置直接应用到UserAgent对象。有关更多细节,请参见LWP::UserAgent文档;搜索ssl_opts

票数 7
EN

Stack Overflow用户

发布于 2013-12-17 13:23:29

$soap->{_transport}->{_proxy}->{ssl_opts}->{verify_hostname} = 0;

票数 3
EN

Stack Overflow用户

发布于 2016-04-01 19:15:07

刚找到这条线,一切对我都很有用,谢谢!

我想添加我的“解决方案”,这是一个变化的前一个,以防止它有助于其他人。

添加

代码语言:javascript
运行
复制
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

绝对是关键。但是,这会导致警告从IO::Socket::SLL中传出。

代码语言:javascript
运行
复制
*******************************************************************
 Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
 is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
 together with SSL_ca_file|SSL_ca_path for verification.
 If you really don't want to verify the certificate and keep the
 connection open to Man-In-The-Middle attacks please set
 SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************

消除这一警告的方法是添加以下几行:

代码语言:javascript
运行
复制
use IO::Socket::SSL;
IO::Socket::SSL::set_defaults(SSL_verify_mode => "SSL_VERIFY_NONE");

除了原始的$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}之外,无论您使用的是什么客户端(LWP::UserAgentRPC::XML::ClientSOAP::Lite等),它都应该能工作。

希望这能帮到别人!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14839098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档