我正试图想办法获取一长串URL的证书颁发者和密钥长度。
任何Perl模块都能提供吗?
致以最诚挚的问候,
Yannick Bergeron
答案 0 :(得分:1)
TLS中涉及几个关键
以下代码应该为您提供公钥的位和用于对称加密的密码。密码是作为所使用算法的字符串给出的,有效密钥长度取决于算法。使用公钥它是类似的,例如只要使用相同的算法,您就可以比较密钥长度,但是在比较RSA和椭圆曲线时,不能简单地比较密钥长度。
use strict;
use warnings;
use IO::Socket::SSL;
my $cl = IO::Socket::SSL->new('www.google.com:443') or die $!;
my $cipher = $cl->get_cipher;
my $issuer = $cl->peer_certificate('issuer');
my $pkey = Net::SSLeay::X509_get_pubkey($cl->peer_certificate);
my $bits = Net::SSLeay::EVP_PKEY_bits($pkey);
my $pkey_type = Net::SSLeay::OBJ_nid2sn( Net::SSLeay::EVP_PKEY_id($pkey));
print "cipher: $cipher\n";
print "cert: issuer=$issuer pkey=$pkey_type/$bits\n";
对我来说,这段代码会返回:
cipher: ECDHE-RSA-RC4-SHA
cert: issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2 pkey=rsaEncryption/2048
如果您需要在短时间内检查大量网站,可以使用非阻塞TCP连接和以后的非阻塞SSL握手来加速代码,从而并行处理多个目标。在这种情况下,请参阅IO :: Socket :: INET和IO :: Socket :: SSL的文档。
答案 1 :(得分:0)
您可以在Net::SSLeay中使用VERIFY_PEER
回调。
use Net::SSLeay;
use Data::Dumper;
use strict;
# install the VERIFY callback
Net::SSLeay::set_verify ($ssl, Net::SSLeay::VERIFY_PEER, sub {
# get out what you want here
# (this is just an example to allow you to see what's available)
print Dumper(\@_);
});
# make an HTTPS request
my ($page) = get_https('www.example.com', 443, '/');
看看它给你带来了什么。 Net :: SSLeay还从OpenSSL实现了一堆特定于类型的证书API,所以你可以看到很多。
将Dumper
行更改为您想要提取的内容。做点什么
my @domains;
Net::SSLeay::set_verify ($ssl, Net::SSLeay::VERIFY_PEER, sub {
push @domains, {
somekey => $_[0]->{somekey},
someotherkey => $_[0]->{someotherkey}
}
});
在任何情况下,只需将get_https
的调用放入函数中,并为要检查的域数组中的每个元素调用它。
您可能希望使用Parallel::ForkManager分叉多个进程以同时验证列表项。