Windows/Perl/Net::SSLeay/OpenSSL:CA证书从哪些位置加载?

Windows/Perl/Net::SSLeay/OpenSSL:CA证书从哪些位置加载?,windows,perl,openssl,ssl-certificate,lwp,Windows,Perl,Openssl,Ssl Certificate,Lwp,下面是一个执行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";

下面是一个执行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
设置为默认加载的
Mozilla::CA
中的PEM文件
cacert.PEM
的值(我使用
procmon.exe
进行了检查,默认情况下该文件是完全读取的)

这样做显然毫无意义的原因是,我们有一些Windows机器(Windows Server 2008),其中SSL设置失败,当未设置环境变量时,证书验证失败。为什么会这样对我们来说是个谜。它在其他Windows机器上运行良好,这些机器的版本相同,分别为
Net::SSLeay
LWP::Protocol::https
Mozilla::CA

我们的模块版本为:

  • Net::SSLeay 1.36
  • 地穴:SSLeay-/-
  • LWP::协议::https 6.02
  • Mozilla::CA 20110409
现在的问题是:除了
cacert.pem
,在这个星座(Windows、Perl、Net::SSLeay)中还有其他地方可以加载根证书吗?如果是,它们是什么?我在哪里能读到它

更新

OpenSSL文档未提及除普通文件和普通目录以外的任何证书存储:

用于打开系统证书存储的Windows C API函数如下:

我从CVS检查了OpenSSL头部。
CertOpenStore
功能确实在
引擎/e_capi.c
中使用。我还没有进一步调查,以了解在相关服务器的OpenSSL版本中,使用什么来访问存储


如果您进行web搜索,您将看到一些人想知道OpenSSL是否可以直接访问Windows证书存储,或者是否可以访问Windows证书存储。还有这个。需要进行更多的研究来找出问题所在。

由于LWP 6.00,您可以将ssl\u opts hashref传递给new,指定证书文件以及其他选项:

my $ua = LWP::UserAgent->new(
    ssl_opts   => {
        verify_hostname => 1,
        SSL_cert_file   => $ssl_cert_file,
        SSL_key_file    => $ssl_key_file,
    },
);

CA证书的选项称为
SSL\u CA\u file
SSL\u CA\u path
,您在代码示例中弄错了。但我在示例脚本中没有使用这些选项,它也没有回答我的问题。无论如何,谢谢。很抱歉,这些是用于证书身份验证的。我的观点是,您可以使用参数来设置这些变量,而不是全局的环境变量。如果设置了CA文件或路径,它将使用配置的CA文件或路径,并返回到Mozilla::CA。在您的情况下,我建议您检查故障服务器是否使用ntp设置了正确的时间。谢谢。你能解释一下为什么你认为正确的时间很重要吗?严重错误配置日期的证书到期日期,如机器日期设置在遥远的将来,因此CA证书似乎已过期?是的,这是我能想到的服务器之间可能不同的事情之一。我不确定Windows上的Perl CA模块是否使用它,但请检查Windows证书存储是否存在差异,可能是因为不同的修补程序或服务包。