【问题标题】:SSL error calling Perl web service via https using LWP使用 LWP 通过 https 调用 Perl Web 服务的 SSL 错误
【发布时间】:2014-11-25 02:19:13
【问题描述】:

我有一个 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: 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/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 服务器。

谢谢!

【问题讨论】:

    标签: perl ssl hostname verify


    【解决方案1】:

    如果它在浏览器中有效,但在 LWP 脚本中无效,可能是因为缺少中间证书。浏览器经常从早期的 SSL 连接接收这些中间证书并缓存它们,但脚本通常不这样做。如果您使用SSLLabs 检查主机并注意“链问题”,则可以检查这一点。

    如果这不是问题,请提供您正在使用的模块的版本,最好还提供您尝试访问的主机的 URL。获取版本:

    #!/usr/bin/perl
    for (qw(LWP::UserAgent LWP::Protocol::https IO::Socket::SSL)) {
        eval "require $_; warn '$_: '.$_->VERSION";
    }
    

    【讨论】:

    • 我相信你明白了。后来我注意到 Firefox 不喜欢 SSL 证书,尽管 Chrome、IE 和 Safari 喜欢。 FF 抱怨信任链。我尝试使用 GlobalSign 和 AlphaSSL 提供的 CA Bundle 多次重新安装证书,最终将其交给我的服务器管理员。他们说他们只是重新安装了证书,现在 FF 喜欢它。我刚刚回去检查了这个脚本并设置了 $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 1,现在它工作得很好。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2012-11-04
    • 2012-03-17
    • 1970-01-01
    相关资源
    最近更新 更多