使用perl Crypt::X509从证书中提取数据
我试图使用Crypt::X509库从.pem证书中提取数据,但在对象构造中出错。 以下是我正在做的: 1.读取.pem文件的内容:使用perl Crypt::X509从证书中提取数据,perl,ssl,x509,pem,Perl,Ssl,X509,Pem,我试图使用Crypt::X509库从.pem证书中提取数据,但在对象构造中出错。 以下是我正在做的: 1.读取.pem文件的内容: my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat $s_filename; open FILE, "<$s_filename" or die "no such file"; binmode FILE; my $pe
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat $s_filename;
open FILE, "<$s_filename" or die "no such file";
binmode FILE;
my $pem_cert;
read FILE, $pem_cert, $size;
close FILE;
my$oref\u x509=Crypt::x509->new(cert=>$der);
如果($oref_x509->错误){
警告“分析证书时出错:”,
$oref_x509->错误;
}
我得到以下错误:
Error on parsing certificate: decode error 04<=>30 0 8 at ..<path>../Convert/ASN1/_decode.pm line 113.
解析证书时出错:在..../Convert/ASN1/_decode.pm第113行解码错误0430 0 8。
我尝试使用其他证书,但错误相同。您不需要以二进制模式打开base64编码的文件,因为它已经是8位的干净文件。但是,DER文件是二进制文件,因此在该实例中使用
binmode()
是正确的
我认为,问题在于,你想要的证书
解析实际上是PEM格式,而不是DER格式。如果你看Stephan的,他会详细说明差异(主要是DER是PEM的base64解码变体,删除PEM页眉/页脚后)
如果您有权访问openssl,可以使用以下命令将其从PEM转换为DER:
openssl x509 -inform PEM -outform DER -in cert.pem -out cert.der
(其中,cert.pem
是输入证书的名称)
然后,您应该能够将其用于Crypt::X509
如果我试图解析PEM格式文件,或base64解码并解析它,我会得到相同的错误:
Failed to parse cert: decode error 04<=>30 0 8 at /usr/local/share/perl5/Convert/ASN1/_decode.pm line 113.
解析证书失败:在/usr/local/share/perl5/Convert/ASN1/_decode.pm第113行出现解码错误0430 0 8。
但是,如果我使用DER版本,它可以正常工作:
use warnings 'all';
use strict;
use Crypt::X509;
my $file = 'cert.der';
my $size = (stat $file)[7];
my $cert;
open(my $fh, '<', $file) or die "failed to open cert: $!";
binmode($fh);
read $fh, $cert, $size;
close($fh);
my $x509 = Crypt::X509->new(cert => $cert);
if($x509->error) {
die "Failed to parse cert: " . $x509->error;
}
使用警告“全部”;
严格使用;
使用Crypt::X509;
my$file='cert.der';
我的$size=(stat$file)[7];
我的$cert;
open(my$fh),您不需要以二进制模式打开base64编码的文件,因为它已经是8位的干净文件。但是,DER文件是二进制文件,因此在这种情况下使用binmode()
是正确的
我认为,问题在于,你想要的证书
parse实际上是PEM格式,而不是DER格式。如果你看Stephan的,他会详细说明差异(主要是DER是PEM的base64解码变体,删除PEM页眉/页脚后)
如果您有权访问openssl,可以使用以下命令将其从PEM转换为DER:
openssl x509 -inform PEM -outform DER -in cert.pem -out cert.der
(其中,cert.pem
是输入证书的名称)
然后,您应该能够将其用于Crypt::X509
如果我试图解析PEM格式文件,或base64解码并解析它,我会得到相同的错误:
Failed to parse cert: decode error 04<=>30 0 8 at /usr/local/share/perl5/Convert/ASN1/_decode.pm line 113.
解析证书失败:在/usr/local/share/perl5/Convert/ASN1/_decode.pm第113行出现解码错误0430 0 8。
但是,如果我使用DER版本,它可以正常工作:
use warnings 'all';
use strict;
use Crypt::X509;
my $file = 'cert.der';
my $size = (stat $file)[7];
my $cert;
open(my $fh, '<', $file) or die "failed to open cert: $!";
binmode($fh);
read $fh, $cert, $size;
close($fh);
my $x509 = Crypt::X509->new(cert => $cert);
if($x509->error) {
die "Failed to parse cert: " . $x509->error;
}
使用警告“全部”;
严格使用;
使用Crypt::X509;
my$file='cert.der';
我的$size=(stat$file)[7];
我的$cert;
使用MIME::Base64::decode将证书从PEM转换为DER时,打开(my$fh),,您需要删除PEM标头和尾部,即,而不是解码
-----BEGIN CERTIFICATE-----
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
-----END CERTIFICATE-----
您应该只解码base64部分:
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
由于----BEGIN CERTIFICATE-----
等包含有效的base64字符,因此它们将用于解码,而无效字符将被默默忽略。当使用MIME::base64::decode将证书从PEM转换为DER时,您需要删除PEM标头和尾部,即代替解码
-----BEGIN CERTIFICATE-----
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
-----END CERTIFICATE-----
您应该只解码base64部分:
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
由于----BEGIN CERTIFICATE-----
etc包含有效的base64字符,因此它们将用于解码,而无效字符将被忽略