Вот программа, которая выполняет 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
.
Наши версии модуля:
- Net :: SSLeay 1,36
- Crypt :: SSLeay - / -
- LWP :: Protocol :: https 6.02
- Mozilla :: CA 20110409
Теперь вопрос: существуют ли другие места, кроме cacert.pem
, из которых в этом созвездии загружаются корневые сертификаты (Windows, Perl, Net :: SSLeay)? Если так, то кто они? Где я могу прочитать об этом?
Обновление
В документах OpenSSL не упоминается ни одно хранилище сертификатов, кроме простого файла и простого каталога:
Функции Windows C API, используемые для открытия хранилища системных сертификатов, следующие:
Я извлек заголовок OpenSSL из CVS. Функция CertOpenStore
действительно используется в engines/e_capi.c
. Я не исследовал дальше, чтобы выяснить, что используется для доступа к хранилищу в версиях OpenSSL на рассматриваемых серверах.
Если вы выполните поиск в Интернете, вы увидите, что несколько человек задались вопросом, может ли OpenSSL напрямую обращаться к хранилищу сертификатов Windows, или предложило соответственно исправить OpenSSL . В списке TortoiseSVN (хранилище сертификатов Windows / OpenSSL CAPI) также есть недавняя проблема . Чтобы выяснить, в чем здесь дело, нужно провести еще несколько исследований.