Как манипулировать/извлекать содержимое темы в 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/[email protected]/L=NYC/ST=AMER/C=AMER/CN=commonName

Ожидаемый результат после извлечения (HASH) — обратите внимание на содержимое OU, которое имеет «/»

$VAR1 = {
          'CN' => 'commonName',
          'keysize' => 'RSA Public Key: (2048 bit)',
          'SubjAltName' => 'DNS:[email protected], IP Address:192.168.1.1',
          'ST' => 'AMER',
          'O' => 'ABCCommon',
          'emailAddress' => '[email protected]',
          'subject' => '',
          'OU' => 'abcfoundation/ops1',
          'C' => 'AMER',
          'L' => 'NYC'
        };

В настоящее время вывод жонглирует, потому что я думаю, что регулярное выражение неправильно обрабатывает «разделение». Я имею в виду my %CSRInfo=split/[=\/]/,$Subj; во фрагменте кода. У меня могут быть некоторые проблемы с моим регулярным выражением, и я ценю вашу помощь, спасибо!


person EdgyIT    schedule 03.07.2015    source источник
comment
Я думаю, что некоторые примеры ввода/вывода могут быть здесь полезны, учитывая, что мы не можем запустить вашу команду openssl.   -  person Sobrique    schedule 03.07.2015
comment
Поскольку вы не используете ни одну из переменных, которые могут содержать / в шаблоне регулярного выражения, это не проблема. Только если бы вы сделали $foo =~ m/$has_slash/, это было бы интерпретировано как часть шаблона. Для этого вы должны использовать quotemeta. Но вам это не нужно.   -  person simbabque    schedule 03.07.2015
comment
@Sobrique Я добавил ввод и ожидал. Я застрял с этим, так как я полагаюсь только на строку, манипулирующую предметом, извлеченным в CSR.   -  person EdgyIT    schedule 03.07.2015


Ответы (1)


Ах хорошо. Да я вижу. Вы пытаетесь разделить на /, но у вас есть шаблон, включающий /. Это становится сложным, но я бы, вероятно, попытался подойти к этому так:

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

my $subj =
    'subject=/O=ABCCommon/OU=abcfoundation/ops1/[email protected]/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' => '[email protected]',
          'ST' => 'AMER',
          'CN' => 'commonName',
          'O' => 'ABCCommon'
        };

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

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

person Sobrique    schedule 03.07.2015
comment
Работает отлично! Благодарю вас! - person EdgyIT; 03.07.2015
comment
Привет, здесь есть некоторые сложные вещи, не могли бы вы также помочь? Разница в следующем формате: subject=/O=test~@#$^()_+-=\{}|;':",./<>/OU=test~@#$^()_+-=\{}|;':",./<>/emailAdd ress=test~@#$^()_+-=\{}|;':",./<>/L=CDE/ST=ABC/C=AU/CN=test~@#$^()_+ -=\{}|;':",./<> То же самое, нужно извлечь это, но со специальным символом - извините, я новичок в регулярных выражениях и все еще учусь у них. - person EdgyIT; 08.07.2015
comment
Думаю, это было бы лучше, как отдельный вопрос. - person Sobrique; 08.07.2015