这是一个执行 HTTPS 请求的程序,开头有一些代码,我将在下面解释:
use 5.012;
use LWP::UserAgent;
use HTTP::Request::Common;
use Net::SSLeay;
BEGIN {
return unless $^O eq 'MSWin32'; # only needed on Windows
print STDERR "attempting to set HTTPS_CA_FILE to PEM file path\n";
require Mozilla::CA; # load module to determine PEM file path
my $pemfile = do {
my $path = $INC{ 'Mozilla/CA.pm' };
$path =~ s#\.pm$#/cacert.pem#;
$path;
};
if ( -f $pemfile ) {
$ENV{HTTPS_CA_FILE} = $pemfile;
print STDERR "HTTPS_CA_FILE set to $pemfile\n";
}
else {
warn "PEM file $pemfile missing";
}
} # ==========================================================================
$Net::SSLeay::trace = 2;
my $ua = LWP::UserAgent->new;
my $req = GET 'https://client.billsafe.de/';
my $rsp = $ua->request( $req );
say $rsp->is_success ? 'success' : 'failure';
say $rsp->status_line;
say '=================';
say substr $rsp->decoded_content, 0, 200;
say '=================';
# possibly relevant module versions
for ( qw/Net::SSLeay Crypt::SSLeay LWP::Protocol::https Mozilla::CA/ ) {
no strict 'refs';
say $_, "\t", ${"${_}::VERSION"}
}
开头的代码将环境变量设置为默认加载HTTPS_CA_FILE
的 PEM 文件cacert.pem
的值(我使用 进行了检查,默认情况下文件已完全读取)。Mozilla::CA
procmon.exe
这样做显然是荒谬的设置的原因是我们有一些 Windows 机器 (Windows Server 2008) 在未设置环境变量时SSL 设置失败,证书验证失败。为什么会这样,对我们来说是个谜。它在其他具有相同版本的 Windows 机器上运行良好Net::SSLeay
,LWP::Protocol::https
和Mozilla::CA
.
我们的模块版本是:
- 净::SSLeay 1.36
- 地穴::SSLeay -/-
- LWP::协议::https 6.02
- Mozilla::CA 20110409
现在的问题是:除了 之外,还有其他地方cacert.pem
从这个星座(Windows、Perl、Net::SSLeay)中加载根证书吗?如果是这样,它们是什么?我在哪里可以阅读它?
更新
除了普通文件和普通目录之外,OpenSSL 文档没有提到任何证书存储:
用于打开系统证书存储的 Windows C API 函数如下:
我从 CVS 检查了 OpenSSL HEAD。该CertOpenStore
功能确实用于engines/e_capi.c
. 我没有进一步调查以找出用于访问相关服务器上 OpenSSL 版本中的商店的内容。
如果您进行网络搜索,您会发现有几个人想知道 OpenSSL 是否可以直接访问 Windows 证书存储,或者建议对 OpenSSL 进行相应的修补。TortoiseSVN 列表 (Windows Certificate Store / OpenSSL CAPI) 上也有这个最近的问题。需要更多的研究来找出这里的问题。