2015-03-24 2 views
2

Я пытаюсь создать сценарий, который просматривает данные для моих сертификатов в папке ~/ssl/certs и выводит на экран информацию о эмитенте.Не удается получить результаты с помощью Net :: SSLeay for openssl

Он написан на Perl, и было бы легко просто сказать:

$data = `/usr/bin/openssl x509 -in $file -noout -issuer` 

Однако это не очень компактен. Я пытаюсь использовать Net :: SSLeay вместо этого, чтобы получить тот же результат, однако все, что я могу контролировать, - это контрольные суммы, что мне не хватает? Вот что я получил

#!/usr/bin/perl 
use 5.10.1; 
use strict; 
use warnings; 
use Net::SSLeay qw(die_now die_if_ssl_error); 
Net::SSLeay::load_error_strings(); 
Net::SSLeay::SSLeay_add_ssl_algorithms(); # Important! 
Net::SSLeay::ENGINE_load_builtin_engines(); # If you want built-in engines 
Net::SSLeay::ENGINE_register_all_complete(); # If you want built-in engines 
Net::SSLeay::randomize(); 
Net::SSLeay::library_init(); 
Net::SSLeay::OpenSSL_add_all_algorithms(); 
my $file = '~/ssl/certs/certificate.crt'; 

my $x509 = Net::SSLeay::X509_new(); 
Net::SSLeay::X509_free($x509); 
my $type = Net::SSLeay::X509_certificate_type($x509); 
my $ctx = Net::SSLeay::CTX_new_with_method(Net::SSLeay::TLSv1_method()); 
my $test = Net::SSLeay::X509_load_cert_file($ctx, $file, $type); 
my $info = Net::SSLeay::X509_issuer_name_hash($x509); 

say "\nInfo = $info \nX509 = $x509\nTest= $test\nType = $type\nCTX = $ctx"; 



This is my output: 
Info = 4003674586 
X509 = 16119648 
Test= 0 
Type = 0 
CTX = 16137888 

Я прочитал весь исходный код и документацию, ничто из этого не имеет никакого смысла.

ответ

1

Вам не нужен весь этот контекст и т. Д. После инициализации SS L, вы можете просто:

my $bio = Net::SSLeay::BIO_new_file($file,'r') or die $!; 
my $cert = Net::SSLeay::PEM_read_bio_X509($bio); 
Net::SSLeay::BIO_free($bio); 
$cert or die "cannot parse $file as PEM X509 cert: ". 
    Net::SSLeay::ERR_error_string(Net::SSLeay::ERR_get_error()); 
my $issuer = Net::SSLeay::X509_NAME_oneline(
    Net::SSLeay::X509_get_issuer_name($cert)); 
+0

Спасибо тонну! Это отлично работает, им действительно нужно лучше объяснить свою документацию. – Jeffrey

+0

@Jeffrey: 'Net :: SSLeay' - бесплатное программное обеспечение, и разработчики в моем опыте очень открыты для изменений, которые улучшают программное обеспечение. Поэтому не стесняйтесь предоставлять исправления, которые улучшают документацию. –

+0

Можно ли полностью расшифровать версию сертификата или ключа base64 и распечатать данные? Кажется, что вы можете печатать только тему, издателя и очень мало других вещей. Я пытаюсь сравнить модуль с ключом и сертификатом, чтобы убедиться, что они соответствуют – Jeffrey

0

Этот пример может быть в состоянии получить вас начали:

https://metacpan.org/source/MIKEM/Net-SSLeay-1.68/examples/x509_cert_details.pl

Я отрезала соответствующие биты из него просто получить эмитента:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Net::SSLeay qw/XN_FLAG_RFC2253 ASN1_STRFLGS_ESC_MSB/; 

Net::SSLeay::randomize(); 
Net::SSLeay::load_error_strings(); 
Net::SSLeay::ERR_load_crypto_strings(); 
Net::SSLeay::SSLeay_add_ssl_algorithms(); 

my $file = shift; 
chomp($file); 

my $bio = Net::SSLeay::BIO_new_file($file, 'rb') or die "ERROR: BIO_new_file failed"; 
my $x509 = Net::SSLeay::PEM_read_bio_X509($bio) or die "ERROR: PEM_read_bio_X509 failed"; 

my $issuer_name = Net::SSLeay::X509_get_issuer_name($x509); 
print Net::SSLeay::X509_NAME_print_ex($issuer_name) . "\n"; 

Итак:

$ perl ssl.pl /usr/share/ca-certificates/mozilla/XRamp_Global_CA_Root.crt 
CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US 
Смежные вопросы