Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用perl Crypt::X509从证书中提取数据_Perl_Ssl_X509_Pem - Fatal编程技术网

使用perl Crypt::X509从证书中提取数据

使用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

我试图使用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; 
  • 调用Crypt::X509构造函数并检查错误:
  • 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字符,因此它们将用于解码,而无效字符将被忽略