2015-07-03 2 views
2

В настоящее время я работаю над тем, чтобы правильно извлекать каждое содержимое в теме файла CSR. У меня есть рабочий фрагмент, но я застрял, когда у значений есть слэш/(например, контент CSR имеет OrganizationUnit = orgunit/testou) для значений. То, как я делаю, чтобы извлечь содержимое, - это использовать регулярное выражение, разбить его и нажать на него в хэше и вернуть его обратно в интерфейс. Смотрите ниже:Как строка манипулировать/извлекать содержимое объекта в CSR с помощью команды OpenSSL + Perl?

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 похожее на это:

subject=/O=ABCCommon/OU=abcfoundation/ops1/[email protected]/L=NYC/ST=AMER/C=AMER/CN=commonName 

Ожидаемый результат после экстракции (HASH) - Обратите внимание на содержание подразделений, которое имеет "/"

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

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

+1

Я думаю, что здесь может быть полезен пример ввода/вывода, поскольку мы не можем запустить команду 'openssl'. – Sobrique

+0

Поскольку вы не используете ни одну из переменных, которые могут содержать '/' в шаблоне регулярного выражения, это не проблема. Только если вы сделали '$ foo = ~ m/$ has_slash /', он будет интерпретироваться как часть шаблона. Для этого вы будете использовать 'quotemeta'. Но вам это не нужно. – simbabque

+0

@Sobrique Я добавил вход и ожидал. Я застрял в этом, поскольку я только полагаюсь на строку, манипулирующую предмет, извлеченный в CSR. – macjop

ответ

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

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

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

+0

Отлично работает! Спасибо! – macjop

+0

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

+2

Думайте, что было бы лучше, как отдельный вопрос. – Sobrique

Смежные вопросы