如何使用 Perl 库正确获取 SAN Crypt::OpenSSL::X509
How to properly obtain SAN using Perl library Crypt::OpenSSL::X509
我以前一直在使用 Crypt::X509,但现在我将我的代码移植到更新的支持库 Crypt::OpenSSL::X509。证书中最重要的字段是 CN 和 SAN,我希望有一个简单的调用,如:
use Crypt::X509;
print $x509->$cert_hr->SubjectAltName;
但是我不得不使用繁琐的代码:
use Crypt::OpenSSL::X509;
my $ext = $x509->extensions_by_oid();
print ${$ext}{'2.5.29.17'}->value();
但更糟糕的是,返回的字符串带有寄生“.”。在里面,我需要创建一些智能正则表达式来安全地清理它。
我觉得我缺少一些简单的东西。还有其他函数或库吗?
编辑:测试结果:只要您更新到最新版本的库,建议的 Timothy 解决方案就可以工作。无法添加评论,也不按 'Accepted answer.' 稍后会重新访问。
这是一个如何使用 Crypt::OpenSSL::X509 和 Convert::ASN1 的例子,我必须说这比我预期的要花费更多的时间:
use Crypt::OpenSSL::X509;
use Convert::ASN1;
my $x509 = Crypt::OpenSSL::X509->new_from_file('google.pem');
my $ext = $x509->extensions_by_oid();
my $pdu = ${$ext}{'2.5.29.17'}->value();
$pdu =~ s/#//g;
my @san = get_san($pdu);
print "Size: ", scalar @san, "\n";
foreach (@san) {
print "$_\n";
}
sub get_san {
my $bin_data = join '', pack 'H*', @_;
$asn = Convert::ASN1->new();
my $ok = $asn->prepare(q<
DNSName ::=
[2]
IA5String
SubjectAltName ::= SEQUENCE OF
DNSName
>);
die "*** Could not prepare definition: ".$asn->error()
if !$ok;
my $top = $asn->find("SubjectAltName")
or die $asn->error;
$out = $top->decode($bin_data)
or die "can't decode SubjectAltName: ".$top->error;
return @$out;
}
https://github.com/dsully/perl-crypt-openssl-x509/pull/92 实现了它的扩展形式,它应该适用于大多数 X509 证书
我以前一直在使用 Crypt::X509,但现在我将我的代码移植到更新的支持库 Crypt::OpenSSL::X509。证书中最重要的字段是 CN 和 SAN,我希望有一个简单的调用,如:
use Crypt::X509;
print $x509->$cert_hr->SubjectAltName;
但是我不得不使用繁琐的代码:
use Crypt::OpenSSL::X509;
my $ext = $x509->extensions_by_oid();
print ${$ext}{'2.5.29.17'}->value();
但更糟糕的是,返回的字符串带有寄生“.”。在里面,我需要创建一些智能正则表达式来安全地清理它。
我觉得我缺少一些简单的东西。还有其他函数或库吗?
编辑:测试结果:只要您更新到最新版本的库,建议的 Timothy 解决方案就可以工作。无法添加评论,也不按 'Accepted answer.' 稍后会重新访问。
这是一个如何使用 Crypt::OpenSSL::X509 和 Convert::ASN1 的例子,我必须说这比我预期的要花费更多的时间:
use Crypt::OpenSSL::X509;
use Convert::ASN1;
my $x509 = Crypt::OpenSSL::X509->new_from_file('google.pem');
my $ext = $x509->extensions_by_oid();
my $pdu = ${$ext}{'2.5.29.17'}->value();
$pdu =~ s/#//g;
my @san = get_san($pdu);
print "Size: ", scalar @san, "\n";
foreach (@san) {
print "$_\n";
}
sub get_san {
my $bin_data = join '', pack 'H*', @_;
$asn = Convert::ASN1->new();
my $ok = $asn->prepare(q<
DNSName ::=
[2]
IA5String
SubjectAltName ::= SEQUENCE OF
DNSName
>);
die "*** Could not prepare definition: ".$asn->error()
if !$ok;
my $top = $asn->find("SubjectAltName")
or die $asn->error;
$out = $top->decode($bin_data)
or die "can't decode SubjectAltName: ".$top->error;
return @$out;
}
https://github.com/dsully/perl-crypt-openssl-x509/pull/92 实现了它的扩展形式,它应该适用于大多数 X509 证书