【问题标题】:How to string manipulate/extract subject contents in a CSR using OpenSSL command + Perl?如何使用 OpenSSL 命令 + Perl 对 CSR 中的主题内容进行字符串操作/提取?
【发布时间】:2015-09-21 00:57:21
【问题描述】:

我目前正在努力正确提取 CSR 文件主题中的每个内容。我在这里有一个工作的sn-p,但是当值有斜线/(例如,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'
        };

目前输出是杂耍的,因为我认为正则表达式没有正确处理“拆分”。我指的是代码 sn-p 中的my %CSRInfo=split/[=\/]/,$Subj;。 我的正则表达式可能有一些问题,感谢您的帮助,谢谢!

【问题讨论】:

  • 我认为一些示例输入/输出在这里可能有用,因为我们无法运行您的 openssl 命令。
  • 因为您没有使用任何可能在正则表达式模式中包含/ 的变量,所以这不是问题。仅当您执行$foo =~ m/$has_slash/ 时,它才会被解释为模式的一部分。为此,您将使用quotemeta。但你不需要那个。
  • @Sobrique 我添加了输入并预期输出。我被困住了,因为我只依靠字符串操作在 CSR 中提取的主题

标签: regex perl openssl csr


【解决方案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'
        };

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

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

【讨论】:

  • 效果很好!谢谢!
  • 嗨,这里有一些复杂的东西,介意你也可以帮忙吗?不同之处在于这种格式:subject=/O=test~@#$^()_+-=\{}|;':",./<>/OU=test~@#$^()_+-=\{}|;':",./<>/emailAdd ress=test~@#$^()_+-=\{}|;':",./<>/L=CDE/ST=ABC/C=AU/CN=test~@#$^()_+ -=\{}|;':",./<> 相同的东西,需要提取这个,但是带有特殊字符——对不起,我是正则表达式的新手,仍在学习它。
  • 认为最好作为一个单独的问题。
猜你喜欢
  • 2013-09-03
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
相关资源
最近更新 更多