我有一个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);
帖子中的网关是在同一域下运行的 Web 服务脚本的 https: 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服务器。
谢谢!
如果它在浏览器中有效,但在 LWP 脚本中不起作用,则可能是因为缺少中间证书。浏览器通常从早期的SSL连接接收这些中间证书并缓存它们,但脚本通常不会这样做。如果您使用 SSLLabs 检查主机并注意"链问题",则可以检查这一点。
如果这不是问题,请提供您正在使用的模块的版本,最好还提供您尝试访问的主机的 URL。要获取版本,请执行以下操作:
#!/usr/bin/perl
for (qw(LWP::UserAgent LWP::Protocol::https IO::Socket::SSL)) {
eval "require $_; warn '$_: '.$_->VERSION";
}