如何使用OpenSSL命令+ Perl对CSR中的主题内容进行字符串操作?

时间:2015-07-03 08:48:34

标签: regex perl openssl csr

我目前正在努力正确提取CSR文件主题中的每个内容。我在这里有一个工作片段,但是当值在值上有斜杠/(例如CSR内容具有OrganizationUnit = orgunit / testou)时,我被卡住了。我提取内容的方法是使用正则表达式,将其拆分并将其推入哈希,然后将其放回前端。见下文:

sub CSRDecode{
###########################################################################
################Do Your Validation#########################################
###########################################################################
my @returnInfo = `openssl req -in /opt2/myfiles/perllib/custom/OpenSSL/certreq.csr -text -noout` or die "Could not validate CSR";
my $Subj= `openssl req -in /opt2/myfiles/perllib/custom/OpenSSL/certreq.csr -subject -noout` or die "Could not validate CSR";
print $Subj;
print @returnInfo;
my $KeySize= @returnInfo[6];


my $SubjAltName =`openssl req -in /opt2/myfiles/perllib/custom/OpenSSL/certreq.csr -text -noout|grep -E 'email|DNS'`; #or die "Could not get SAN";

$KeySize=~s/^\s+|\s+$//g;
$KeySize=~/(.+?)/;
$Subj =~ s/^\s+|\s+$//g;

print $Subj;
$SubjAltName=~ s/^\s+|\s+$//g;

my %CSRInfo=split/[=\/]/,$Subj;
if(%CSRInfo){
%CSRInfo->{SubjAltName}.=$SubjAltName;
%CSRInfo->{keysize}.=$KeySize;
}


print Dumper \%CSRInfo;

#######################################################################

输入:CSR文件与主题类似:

subject=/O=ABCCommon/OU=abcfoundation/ops1/emailAddress=allgroup@abccommon.com/L=NYC/ST=AMER/C=AMER/CN=commonName

提取后的预期输出(HASH) - 请注意具有" /"

的OU内容



$VAR1 = {
          'CN' => 'commonName',
          'keysize' => 'RSA Public Key: (2048 bit)',
          'SubjAltName' => 'DNS:serverxxx.internal@abc.com, IP Address:192.168.1.1',
          'ST' => 'AMER',
          'O' => 'ABCCommon',
          'emailAddress' => 'allgroup@abccommon.com',
          'subject' => '',
          'OU' => 'abcfoundation/ops1',
          'C' => 'AMER',
          'L' => 'NYC'
        };




目前输出是杂乱的,因为我认为正则表达式没有正确处理" split"。我在代码段中引用了my %CSRInfo=split/[=\/]/,$Subj;。 我的正则表达式可能会有一些问题,感谢您的帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

啊,好的。是的,我明白了。您尝试拆分/,但其模式包含/。这很复杂,但我可能会尝试这样做:

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

my $subj =
    'subject=/O=ABCCommon/OU=abcfoundation/ops1/emailAddress=allgroup@abccommon.com/L=NYC/ST=AMER/C=AMER/CN=commonName';

my %subjinfo = ( $subj =~ m,(\w+)=([^=]*)(?:/|$),g );
print Dumper \%subjinfo;

然后给出:

$VAR1 = {
          'subject' => '',
          'L' => 'NYC',
          'C' => 'AMER',
          'OU' => 'abcfoundation/ops1',
          'emailAddress' => 'allgroup@abccommon.com',
          'ST' => 'AMER',
          'CN' => 'commonName',
          'O' => 'ABCCommon'
        };

我认为这可以满足您的需求。这个正则表达式重复,并捕获成对的事物'在=的任意一侧以/或'行结尾'结尾$

因为我们成对匹配(最后一组有(?:来表示它的非捕获),所以可以直接将它们分配到哈希中。