OCSP resol_blocking () и LWP :: UserAgent - PullRequest
0 голосов
/ 06 июня 2018

Этот вопрос касается использования Perl IO::Socket::SSL / Net::SSLeay / LWP::UserAgent.

Для проверки отзыва сертификатаДля получения статуса с OCSP необходимо явно вызвать ocsp_resolver сокета, например, resolve_blocking().Это стратегия, которую я использую при подключении через Net::LDAP.

Но в LWP::UserAgent соединение является частным кэшированным атрибутом объекта.

Могу ли я получитьссылка на сокет из обратного вызова проверки, т.е. второй аргумент обратного вызова?

Если это так, то

  • Как?Кажется, я не нашел подходящего Net::SSLeay::X509_Store<somthing> вызова.

  • Могу ли я провести блокировку OCSP в этот момент?

Если нет,затем

  • Как вызвать ocsp_resolver?

Мне нужно это для проверки статуса сертификата веб-серверов без сшивания, а также статуса сертификата цепочек (обычноне скреплены).

Ответы [ 2 ]

0 голосов
/ 19 июня 2018

В конце концов, я решил эту проблему, добавив IO::Socket::SSL для поддержки нового аргумента SSL_ocsp_check_callback.

Я оцениваю его как connect_SSL() сразу после всех других попыток OCSP.Вот патч, который я использовал (более perl-IO-Socket-SSL-2.025-1.noarch)

--- /tmp/SSL.pm 2018-06-13 12:05:17.073787660 +0300
+++ /usr/local/share/perl5/IO/Socket/SSL.pm 2018-06-14 09:33:40.051022329 +0300
@@ -631,11 +631,11 @@
     my $args = @_>1 ? {@_}: $_[0]||{};

     my ($ssl,$ctx);
+    my $arg_hash = ${*$self}{'_SSL_arguments'};
     if ( ! ${*$self}{'_SSL_opening'} ) {
    # start ssl connection
    $DEBUG>=2 && DEBUG('ssl handshake not started' );
    ${*$self}{'_SSL_opening'} = 1;
-   my $arg_hash = ${*$self}{'_SSL_arguments'};

    my $fileno = ${*$self}{'_SSL_fileno'} = fileno($self);
    return $self->_internal_error("Socket has no fileno",9)
@@ -820,11 +820,22 @@
        $self->_internal_error($ocsp_result->[1],5);
        return $self->fatal_ssl_error();
    }
+
     } elsif ( $ctx->{ocsp_mode} & SSL_OCSP_MUST_STAPLE ) {
    $self->_internal_error("did not receive the required stapled OCSP response",5);
    return $self->fatal_ssl_error();
+
+    } elsif (exists $arg_hash->{SSL_ocsp_check_callback}) {
+        $DEBUG>=3 && DEBUG( "Checking OCSP with application callback" );
+        my $callback = $arg_hash->{SSL_ocsp_check_callback};
+        my $errors = &$callback($self);
+        if ($errors) {
+            $self->_internal_error($errors,5);
+            return $self->fatal_ssl_error();
+        }
     }

+
     if ( $ctx->has_session_cache
    and my $session = Net::SSLeay::get1_session($ssl)) {
    my $arg_hash = ${*$self}{'_SSL_arguments'};
0 голосов
/ 08 июня 2018

Я думаю, что (в настоящее время, по состоянию на IO::Socket::SSL 2.056) нет чистого способа сделать это.

Но так как это Perl, это можно сделать с помощью некоторого исправления обезьяны.Так как проверку лучше всего выполнять сразу после успешного подключения к серверу, можно использовать оболочку около IO::Socket::SSL::connect_SSL для получения сокета SSL, выполните проверку OCSP и разрешите неудачное соединение, если проверка OCSP привела к ошибкам:

use strict;
use warnings;
use IO::Socket::SSL;
use LWP::UserAgent;

{
    my $old = \&IO::Socket::SSL::connect_SSL;
    no warnings 'redefine';
    *IO::Socket::SSL::connect_SSL = sub {
        my $sock = $old->(@_) or return;
        my $ocsp = $sock->ocsp_resolver;
        if (my $errors = $ocsp->resolve_blocking()) {
            warn $errors;
            close($sock);
            return;
        }
        return $sock;
    }
}

my $ua = LWP::UserAgent->new();
$ua->ssl_opts(SSL_ocsp_mode => SSL_OCSP_FULL_CHAIN|SSL_OCSP_FAIL_HARD|SSL_OCSP_NO_STAPLE);
my $resp = $ua->get('https://revoked.grc.com');
print $resp->decoded_content;

Обратите внимание, что это исправление обезьяны является глобальным, то есть затрагивает все IO::Socket::SSL объекты, а не только тот, который используется в LWP::UserAgent.Так что это может иметь некоторые непреднамеренные побочные эффекты при использовании в более сложной программе, чем в этом примере.Более чистый дизайн мог бы иметь некоторый пользовательский обратный вызов после подключения.Возможно, я добавлю этот тип функциональности в IO::Socket::SSL, но пока этот хак должен работать.

Обратите внимание также, что resolve_blocking не использует объект LWP::UserAgent, а опирается на HTTP::Tiny.Таким образом, любые настройки, специфичные для LWP::UserAgent подобных прокси, не будут иметь никакого эффекта.Если это проблема, вы можете выполнить запросы вручную и передать их в объект распознавателя OCSP, используя $ocsp->requests для получения запросов и $ocsp->add_response для передачи ответа в объект распознавателя.

...