如何使用 OpenSSL 命令 + Perl 在 CSR 中串入 manipulate/extract 主题内容?
How to string manipulate/extract subject contents in a CSR using OpenSSL command + Perl?
我目前正在努力正确提取 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;
。
我的正则表达式可能有一些问题,感谢您的帮助,谢谢!
啊,好的。好的我知道了。您试图在 /
上拆分,但有一个包含 /
的模式。这变得很复杂,但我可能会尝试这样处理它:
#!/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'
};
我认为这可以满足您的需求。此正则表达式重复,并在以 /
或 'end of line' $
结尾的 =
两侧捕获 'things' 对
因为我们是成对匹配的(最后一组有 (?:
表示它是非捕获的)这些可以直接分配到哈希中。
我目前正在努力正确提取 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;
。
我的正则表达式可能有一些问题,感谢您的帮助,谢谢!
啊,好的。好的我知道了。您试图在 /
上拆分,但有一个包含 /
的模式。这变得很复杂,但我可能会尝试这样处理它:
#!/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'
};
我认为这可以满足您的需求。此正则表达式重复,并在以 /
或 'end of line' $
=
两侧捕获 'things' 对
因为我们是成对匹配的(最后一组有 (?:
表示它是非捕获的)这些可以直接分配到哈希中。