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

标签 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";
    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 设置失败并显示证书验证失败。为什么会这样,对我们来说是个谜。它在其他具有相同版本的 Net::SSLeayLWP::Protocol::httpsMozilla::CA 机器上运行良好.

我们的模块版本是:

  • 网络::SSLeay 1.36
  • 地穴::SSLeay -/-
  • LWP::协议(protocol)::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 证书存储,或者是否有 proposed to patch OpenSSL accordingly .还有这个 recent issue on the TortoiseSVN list (Windows Certificate Store / OpenSSL CAPI) .需要进行更多研究才能找出问题所在。

最佳答案

从 LWP 6.00 开始,您可以将 ssl_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,
    },
);

关于Windows/Perl/Net::SSLeay/OpenSSL:从哪些位置加载 CA 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7662213/

相关文章:

c++ - Openssl 消息摘要单向暴力攻击

java - Android 上生成的不同 RSA 公钥

RegEx,替换可变数量的替换

perl - 如何使用 ActivePerl 运行 Perl 脚本?

c++ - 使用 Win7/64 分析在 XP/32 机器上生成的 Windows 崩溃转储?

c++ - C++ 中的 Windows LDAP 身份验证

取消引用未定义的数组引用时的 Perl 激活问题

firefox - 从 Firefox 签署客户端证书以进行身份​​验证

.net - 学习Win32开发GUI应用程序

windows - 如何在 Windows 上检索 cmd.exe 的 PID?