Вот программа, которая делает запрос HTTPS, с каким-то кодом в начале, что я собираюсь объяснить ниже:Windows/Perl/Net :: SSLeay/OpenSSL: в каких местоположениях загружены сертификаты CA?
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 :: Протокол :: HTTPS 6,02
- Mozilla :: CA 20110409
Теперь вопрос: есть ли другие места, кроме cacert.pem
, из этого созвездия загружаются корневые сертификаты (Windows, Perl , Net :: SSLeay)? Если так, то кто они? Где я могу это прочитать?
Update
Документы OpenSSL не говоря уже о каком-либо хранилище сертификатов, кроме простого файла и простой каталога:
средства Windows C Функции API, используемые для открытия хранилища сертификатов системы, - это foll из-за:
Я проверил ГОЛОВУ OpenSSL из CVS. Функция CertOpenStore
действительно используется в engines/e_capi.c
. Я еще не исследовал, чтобы узнать, что используется для доступа к хранилищу в версиях OpenSSL на соответствующих серверах.
Если вы выполните поиск в Интернете, вы увидите, что несколько человек задаются вопросом, может ли OpenSSL получить доступ к хранилищу сертификатов Windows напрямую или proposed to patch OpenSSL accordingly. Там также есть recent issue on the TortoiseSVN list (Windows Certificate Store/OpenSSL CAPI). Необходимо провести еще несколько исследований, чтобы выяснить, что здесь происходит.
Опции для сертификатов ЦС называются '' SSL_ca_file' и SSL_ca_path', вы получили, что неправильно в вашем примере кода. Но я не использовал эти параметры в своем примере сценария, и это не отвечает на мой вопрос. Спасибо, в любом случае. – Lumi
К сожалению, для аутентификации сертификатов. Я хотел сказать, что вы можете использовать параметры для их настройки вместо переменных окружения, которые являются глобальными. –
Взгляните на https://metacpan.org/source/GAAS/LWP-Protocol-https-6.02/lib/LWP/Protocol/https.pm. Он использует сконфигурированный файл CA или путь, если они установлены и возвращаются в Mozilla :: CA. В вашем случае я предлагаю вам проверить, установлены ли у неудачных серверов правильное время, установленное с помощью ntp. –