这个问题是关于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


我需要它来检查非装订Web服务器以及链式证书(通常不装订)的证书状态。

最佳答案

我认为(目前,从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->requests将其馈送到OCSP解析器对象,并使用$ocsp->add_response将响应馈送到解析器对象。

关于perl - OCSP resolve_blocking()和LWP::UserAgent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50721193/

10-14 02:25