首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用perl Crypt::X 509从证书中提取数据

用perl Crypt::X 509从证书中提取数据
EN

Stack Overflow用户
提问于 2016-08-17 08:02:46
回答 2查看 2.2K关注 0票数 2

我试图使用Crypt::X 509库从.pem证书中提取数据,但是在对象构造中出现了一个错误。下面是我正在做的工作: 1.读取.pem文件的内容:

代码语言:javascript
复制
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; 
  1. 对base64中的内容进行解码,以接收格式化的内容。这是因为Crypt::X 509库的CPAN文档声明需要传递:

包含要解析的DER格式化证书的变量。

代码语言:javascript
复制
my $der = MIME::Base64::decode($pem_cert);
  1. 调用Crypt::X 509构造函数并检查错误:

my $oref_x509= Crypt::X509->new(cert=>$der); if ( $oref_x509->error ) { warn "Error on parsing certificate: ", $oref_x509->error; }

我得到以下错误:

代码语言:javascript
复制
Error on parsing certificate: decode error 04<=>30 0 8  at ..<path>../Convert/ASN1/_decode.pm line 113.  

我试过使用其他证书,但错误是相同的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-17 08:40:10

当使用MIME::Base64 64::decode将证书从PEM转换为DER时,需要删除PEM头和预告片,而不是解码

代码语言:javascript
复制
-----BEGIN CERTIFICATE-----
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
-----END CERTIFICATE-----

您应该只解码base64部分:

代码语言:javascript
复制
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....

由于-----BEGIN CERTIFICATE-----等包含有效的base64字符,它们将用于解码,而无效字符则被忽略。

票数 2
EN

Stack Overflow用户

发布于 2016-08-17 08:38:00

您不应该需要在二进制模式下打开base64编码的文件,因为它已经是8位干净的。然而,DER文件是二进制文件,因此在该实例中使用binmode()是正确的。

问题是,我认为,您要解析的证书实际上是PEM格式,而不是DER格式。如果您看一下Stephan的answer,他会详细说明不同之处(主要是在删除base64页眉/页脚之后,DER是PEM的base64解码变体)。

如果您可以访问openssl,则可以使用以下命令将其从PEM转换为DER:

代码语言:javascript
复制
openssl x509 -inform PEM -outform DER -in cert.pem -out cert.der

(其中cert.pem是输入证书的名称)。

然后,您应该能够在Crypt::X 509中使用它。

如果我试图解析一个PEM格式文件,或者base64对它进行解码并解析它,我会得到相同的错误:

代码语言:javascript
复制
Failed to parse cert: decode error 04<=>30 0 8  at /usr/local/share/perl5/Convert/ASN1/_decode.pm line 113.

但是,如果我使用DER版本,它将正确工作:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38991171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档