perl确定URL SSL证书密钥长度

时间:2014-01-23 02:49:54

标签: perl ssl key

我正试图想办法获取一长串URL的证书颁发者和密钥长度。

任何Perl模块都能提供吗?

致以最诚挚的问候,

Yannick Bergeron

2 个答案:

答案 0 :(得分:1)

TLS中涉及几个关键

  • 证书中的公钥
  • 用于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分叉多个进程以同时验证列表项。