perl - OCSP resolve_blocking() 和 LWP::UserAgent

标签 perl ssl user-agent lwp ocsp

这个问题是关于 Perl 的用法 IO::Socket::SSL / Net::SSLeay / LWP::UserAgent .

要使用 OCSP 检查证书吊销状态,需要显式调用 ocsp_resolver socket ,例如resolve_blocking() . 这是我通过连接时使用的策略 Net::LDAP .

但是在LWP::UserAgent ,连接是对象的私有(private)缓存属性。

我能否从验证回调中获取套接字引用,即回调的第二个参数?

如果是这样

  • 如何?我好像没找到合适的Net::SSLeay::X509_Store<somthing>打电话。

  • 此时我可以进行阻塞 OCSP 吗?

如果没有,那么

  • 如何调用 ocsp_resolver

我需要这个来检查非装订网络服务器的证书状态,以及链证书(通常不装订)的证书状态。

最佳答案

我认为(目前,从 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 中添加这种功能,但现在这个 hack 应该可行。

另请注意,resolve_blocking 并未使用 LWP::UserAgent 对象,而是依赖于 HTTP::Tiny。因此,任何特定于 LWP::UserAgent 的设置(如代理)都将无效。如果这是一个问题,您可以手动执行请求并将其馈送到 OCSP 解析器对象中,使用 $ocsp->requests 获取请求并使用 $ocsp->add_response将响应提供给解析器对象。

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

相关文章:

perl - 在Perl的foreach中,$ _比命名变量更有效吗?

c# - 在平衡字符中搜索特定文本(递归

ssl - 当通过移动设备访问页面时,普通 SSL 是否可以完成这项工作? (iPhone、安卓等)

Java MySQL 与 SSL 授权证书的连接

java - 收到致命警报:SSLHandshakeException中的handshake_failure

javascript - 不同网站上的不同用户代理

html - 覆盖 Chrome UA 文本输入样式

perl - 如何使用 PerlMagick 提取 EXIF 数据?

CSS 和按钮 : How to override native CSS of html buttons element?

perl - Perl 中 '>>' 和 '>' 的区别