Как обработать / извлечь содержимое темы в CSR, используя команду OpenSSL + 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; в фрагменте кода. У меня могут быть некоторые проблемы в моем регулярном выражении, и я ценю вашу помощь, спасибо!

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'
        };

Я думаю, что это дает то, что вам нужно. Это регулярное выражение повторяется и захватывает пары "вещей" по обе стороны от = заканчивая либо / или "конец строки" $

Потому что мы сопоставляем в парах (последняя группа имеет (?: чтобы обозначить, что это не захват) они могут быть непосредственно назначены в хэш.

Другие вопросы по тегам