如何用Perl精准获取SSL证书过期日期?现有方法返回多日期且部分错误
解决SSL证书过期日期获取不准确的问题
你遇到的问题根源在于SSL_verify_callback会在证书链的每一个证书验证环节都被触发——服务器证书、中间证书、根证书都会被回调处理,所以会输出多个过期日期,其中只有服务器证书的日期和浏览器显示的一致。
要获取和浏览器完全一致的准确日期,应该在SSL连接建立完成后,直接提取服务器的证书,而不是在验证回调中处理所有证书。下面是修正后的代码:
use LWP::UserAgent; use Net::SSLeay; my $ua = LWP::UserAgent->new(); my $target_cert; # 设置连接完成后的回调,提取服务器证书 $ua->ssl_opts( SSL_verify_mode => 0x02, # 保持正常的证书验证逻辑,可选 after_connect => sub { my ($socket, $ua, $headers) = @_; # 确认是SSL socket if ($socket->isa('IO::Socket::SSL')) { $target_cert = $socket->peer_certificate(); } }, ); my $url = 'https://pjf.nif.org/m/login'; my $response = $ua->get($url); # 输出准确的过期日期 if ($target_cert) { my $expire_date = Net::SSLeay::P_ASN1_TIME_get_isotime( Net::SSLeay::X509_get_notAfter($target_cert) ); print "证书过期日期:$expire_date\n"; } else { print "无法获取目标服务器证书\n"; }
代码说明
after_connect回调在SSL连接成功建立后执行,此时通过peer_certificate()方法直接获取服务器返回的端证书,也就是浏览器显示的那个证书。- 避免了遍历整个证书链,只会输出一个准确的过期日期,和浏览器证书信息中的日期完全一致。
内容的提问来源于stack exchange,提问作者Anurag Sinha
相关产品推荐
相关产品推荐

