我有一个Perl脚本,它充当在同一域下运行的其他Perl脚本的Web服务。我最近为这个域创建了一个新的SSL证书(AlphaSSL)并将其安装在服务器上,当使用https访问该站点时它显示正常。
但是,现在当客户端脚本通过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:指向在同一域下运行的Web服务脚本的URL。
它产生的错误是:
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 / certs /,其中有一个.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服务器。
谢谢!
答案 0 :(得分:1)
如果它在浏览器中工作但在LWP脚本中不起作用,则可能是因为缺少中间证书。浏览器通常从早期的SSL连接接收这些中间体证书并缓存它们,但脚本通常不会这样做。如果您使用SSLLabs检查主持人,请注意"连锁问题"
如果这不是问题,请提供您正在使用的模块的版本,并且还希望提供您尝试访问的主机的URL。获取版本:
#!/usr/bin/perl
for (qw(LWP::UserAgent LWP::Protocol::https IO::Socket::SSL)) {
eval "require $_; warn '$_: '.$_->VERSION";
}