通过https使用LWP调用Perl Web服务的SSL错误
问题描述:
我有一个Perl脚本,它可以作为运行在同一个域下的其他Perl脚本的Web服务。我最近为这个域创建了一个新的SSL证书(AlphaSSL),并将它安装在服务器上,并且在使用https访问该站点时显示正常。通过https使用LWP调用Perl Web服务的SSL错误
但是,现在当客户端脚本通过LWP使用htttps调用Web服务时,会发出错误,而之前它不是。调用Web服务的代码如下所示:
$useragent = LWP::UserAgent->new();
$useragent->agent("someagentid");
$postdata = {
'action' => $apiaction,
'xauth' => $REQUEST_AUTH_KEY,
};
$response = $useragent->post($BILLING_INFO_GATEWAY, $postdata);
在后网关是HTTPS:URL相同的域下运行的Web服务的脚本。
它产生的错误是:
500 Can't connect to xxxxx.com:443 (certificate verify failed)
Content-Type: text/plain
Client-Date: Tue, 25 Nov 2014 01:52:20 GMT Client-Warning: Internal response
Can't connect to xxxxx.com:443 (certificate verify failed)
LWP::Protocol::https::Socket: SSL connect attempt failed with unknown error
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify
failed at /usr/perl/lib/site_perl/5.10.1/LWP/Protocol/http.pm line 49.
如果我添加:
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
然后错误消失,但随后的安全连接,似乎不太安全。
我已经找到了我的服务器上的证书目录是/ SSL /证书/它有它一个.crt文件,所以我尝试添加:
$ENV{HTTPS_CA_PATH} = '/ssl/certs';
,但我仍然收到错误。我也尝试过:
$ENV{HTTPS_CA_FILE} = '/ssl/certs/xxxxxxxxxx.cabundle';
将CA软件包文件复制到同一文件夹(以前没有任何软件包文件)。 该文件夹包含一个.crt文件,在通过WHM/cPanel安装证书后,该文件已经存在。)
我也尝试指定HTTPS_CA_FILE环境变量,但没有HTTPS_CA_PATH变量但没有运气。仍然错误仍然存在。
有关我可能在代码或服务器中缺少的任何想法以允许脚本成功验证主机名?这是一个运行Linux和cPanel的专用Web服务器。
谢谢!
答
如果它在浏览器中工作,但不在LWP脚本中,可能是因为缺少中间证书。浏览器通常会从早期的SSL连接接收这些中间体证书并缓存它们,但脚本通常不会那样做。如果您使用SSLLabs检查主机并注意“链条问题”,则可以检查此问题。
如果这不是问题,请提供您正在使用的模块的版本,并且还希望您尝试访问的主机的URL。要获得版本:
#!/usr/bin/perl
for (qw(LWP::UserAgent LWP::Protocol::https IO::Socket::SSL)) {
eval "require $_; warn '$_: '.$_->VERSION";
}
我相信你明白了。后来我注意到Firefox即使Chrome,IE和Safari也不喜欢SSL证书。 FF抱怨信任链。我试着用GlobalSign和AlphaSSL提供的CA Bundle多次重新安装证书,最终将其交给我的服务器管理员。他们说他们只是重新安装了证书,现在FF喜欢它。我刚回去检查这个脚本并设置$ ENV {PERL_LWP_SSL_VERIFY_HOSTNAME} = 1,现在它工作得很好。 :) – vdawg 2014-11-26 02:20:54