Windows / Perl / Net :: SSLeay / OpenSSL: из каких мест загружаются сертификаты CA? - PullRequest
4 голосов
/ 05 октября 2011

Вот программа, которая выполняет 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) также есть недавняя проблема . Чтобы выяснить, в чем здесь дело, нужно провести еще несколько исследований.

1 Ответ

0 голосов
/ 20 октября 2011

Начиная с LWP 6.00, вы можете передать хэш-ссылку ssl_opts новому, указав файлы сертификата среди других опций:

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