#windows #perl #openssl #ssl-certificate #lwp
#Windows #perl #openssl #ssl-сертификат #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 pathn";
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 $pemfilen";
}
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)? Если да, то что это такое? Где я могу прочитать об этом?
Обновить
В документах OpenSSL не упоминается ни одно хранилище сертификатов, кроме простого файла и простого каталога:
Для открытия хранилища системных сертификатов используются следующие функции Windows C API:
Я проверил ЗАГОЛОВОК OpenSSL из CVS. CertOpenStore
Функция действительно используется engines/e_capi.c
. Я не проводил дальнейших исследований, чтобы выяснить, что используется для доступа к хранилищу в версиях OpenSSL на рассматриваемых серверах.
Если вы выполните поиск в Интернете, вы увидите, что несколько человек задавались вопросом, может ли OpenSSL напрямую обращаться к хранилищу сертификатов Windows, или предложили соответствующим образом исправить OpenSSL. В списке TortoiseSVN также есть эта недавняя проблема (хранилище сертификатов Windows / OpenSSL CAPI). Необходимы дополнительные исследования, чтобы выяснить, в чем здесь дело.
Ответ №1:
Начиная с 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,
},
);
Комментарии:
1. Вызываются параметры для сертификатов CA
SSL_ca_file
, иSSL_ca_path
вы ошиблись в своем примере кода. Но я не использовал эти параметры в своем примере сценария, и он не отвечает на мой вопрос. В любом случае спасибо.2. Извините за это, они предназначены для проверки подлинности сертификата. Я хотел сказать, что вы можете использовать параметры для их установки вместо переменных среды, которые являются глобальными.
3. Взгляните на metacpan.org/source/GAAS/LWP-Protocol-https-6.02/lib/LWP /. … Он использует настроенный файл CA или путь, если они заданы, и возвращается к Mozilla :: CA. В вашем случае я предлагаю вам проверить, правильно ли установлено время сбоя на серверах с помощью ntp.
4. Спасибо. Не могли бы вы объяснить, почему, по вашему мнению, правильное время имеет значение? Даты истечения срока действия сертификата для грубо неверно настроенных дат, например, машинная дата, установленная далеко в будущем, поэтому срок действия сертификата CA, похоже, истек?
5. Да, это одна из вещей, о которых я могу подумать, которые могут отличаться между вашими серверами. Я не уверен, используют ли его модули CA Perl в Windows, но проверьте хранилище сертификатов Windows на наличие различий, возможно, из-за разных исправлений или пакетов обновления.