使用 perl Crypt::X509 从证书中提取数据
Extract data from certificate with perl Crypt::X509
我正在尝试使用 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 $pem_cert;
read FILE, $pem_cert, $size;
close FILE;
2。从 base64 解码内容以接收 DER 格式的内容。这样做是因为Crypt::X509库的CPAN文档说明需要通过:
A variable containing the DER formatted certificate to be parsed
my $der = MIME::Base64::decode($pem_cert);
- 调用Crypt::X509构造函数并检查错误:
my $oref_x509= Crypt::X509->new(cert=>$der);
if ( $oref_x509->error ) {
warn "Error on parsing certificate: ",
$oref_x509->error;
}
我收到以下错误:
Error on parsing certificate: decode error 04<=>30 0 8 at ..<path>../Convert/ASN1/_decode.pm line 113.
我试过其他证书,但错误是一样的。
您不需要以二进制模式打开 base64 编码的文件,因为它已经是 8 位干净的。但是 DER 文件是二进制文件,因此在这种情况下使用 binmode()
是正确的。
我认为问题在于您要尝试获取的证书
parse 实际上是 PEM 格式而不是 DER 格式。如果您查看 Stephan 的 ,他会详细说明差异(主要是 DER 是 PEM 的 base64 解码变体,在删除 PEM header/footer 之后)。
如果您有权访问 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.
但是,如果我使用 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;
}
使用 MIME::Base64::decode 将证书从 PEM 转换为 DER 时,您需要删除 PEM header 和尾部,即不解码
-----BEGIN CERTIFICATE-----
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
-----END CERTIFICATE-----
你应该只解码 base64 部分:
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
由于 -----BEGIN CERTIFICATE-----
等包含有效的 base64 字符,它们将用于解码,无效字符将被忽略。
我正在尝试使用 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 $pem_cert;
read FILE, $pem_cert, $size;
close FILE;
2。从 base64 解码内容以接收 DER 格式的内容。这样做是因为Crypt::X509库的CPAN文档说明需要通过:
A variable containing the DER formatted certificate to be parsed
my $der = MIME::Base64::decode($pem_cert);
- 调用Crypt::X509构造函数并检查错误:
my $oref_x509= Crypt::X509->new(cert=>$der);
if ( $oref_x509->error ) {
warn "Error on parsing certificate: ",
$oref_x509->error;
}
我收到以下错误:
Error on parsing certificate: decode error 04<=>30 0 8 at ..<path>../Convert/ASN1/_decode.pm line 113.
我试过其他证书,但错误是一样的。
您不需要以二进制模式打开 base64 编码的文件,因为它已经是 8 位干净的。但是 DER 文件是二进制文件,因此在这种情况下使用 binmode()
是正确的。
我认为问题在于您要尝试获取的证书
parse 实际上是 PEM 格式而不是 DER 格式。如果您查看 Stephan 的
如果您有权访问 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.
但是,如果我使用 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;
}
使用 MIME::Base64::decode 将证书从 PEM 转换为 DER 时,您需要删除 PEM header 和尾部,即不解码
-----BEGIN CERTIFICATE-----
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
-----END CERTIFICATE-----
你应该只解码 base64 部分:
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
由于 -----BEGIN CERTIFICATE-----
等包含有效的 base64 字符,它们将用于解码,无效字符将被忽略。