2013-06-27 26 views
0

基礎知識:我有一個.crt文件(認證authoritie文件),他是由許多領域,但在恢復這個問題的一條線,我有這樣的:分析字符串(.CRT文件)

Certificate: 
     ...(alot of stuff before)... 
     Subject: C=US, ST=Maryland, L=Pasadena, O=Brent Baccala, 
       OU=FreeSoft, CN=www.freesoft.org/[email protected] 
     Subject Public Key Info: 
      ...(alot of stuff after) 

我需要解析的文件來填充.csv文件,我有做過,我需要幫助,我需要獲得該領域的問題:

CN=www.fresoft.org 

但是當我得到這樣的CN =的。 ..(值而不是...)與很多斜槓我得到一個錯誤,像原始字符串解析:

CN=foo/bar/the/hell/emailAddress=blablabla 

,我只需要:

foo/bar/the/hell 

,有那麼一會兒我得到的是,在正確的列,但是當我不具備EMAILADDRESS有些事情無法在我的分析,然後我在CN得到.csv文件列中的信息錯誤,而不是

|CN| 
foo/bar/the/hell 

我得到:

|CN| 
OU=FreeSoft, foo/bar/the/hell. 

我有這樣的代碼做CN解析:

#!/bin/bash 

subject_line=$(echo $cert | grep -o "Subject:.*Subject Public Key Info") 

cn=$(echo $subject_line | grep -o "CN=.*") 

if [ $(echo $cn | grep -c ".*email.*") -gt 0 ]; then 
    end_cn=$(echo $cn | grep -b -o emailAddress) 
    end_cn_idx=$(echo $end_cn | grep -o .*:) 
    final_end_cn=${end_cn_idx:0:-1} 
    common_name=${cn:3:$final_end_cn-4} 

    echo $common_name 

else 
    end_cn=$(echo $cn | grep -b -o "Subject Public Key Info") 
     end_cn_idx=$(echo $end_cn | grep -o .*:) 
     final_end_cn=${end_cn_idx:0:-1} 
     common_name=${cn:3:$final_end_cn-5} 

     echo $common_name 
fi 

回答

0

像這樣的東西可能會奏效:

CN=$(openssl x509 -in /path/to/your.crt -noout -subject | 
     sed -r 's|.*CN=(.*)|\1|; s|/[^/]*=.*$||') 

這將會是容易做到在Perl,不過,因爲不像sed Perl可以做非貪婪的匹配:

CN=$(openssl x509 -in /path/to/your.crt -noout -subject | 
     perl -ne 'print "$1" if m|.*CN=(.*?)(?:/[^/]*?=.*)?$|') 
+0

但這不工作,如果我沒有一個電子郵件地址後CN =右? – PythonNewbie

+0

是的。如果該部分是可選的,則必須先將其刪除。我更新了我的答案以反映這一點。 –

+0

嗨,很抱歉,可以在電子郵件上創建一個數組,例如: 如果在CN = blabla/bla存在[「emailAddress =」,「OU =」,「CT =」等]之後,則僅解析直到電子郵件或Ou或CT等。 以某種方式,不管在CN = blablabla/blabla之後會出現什麼......解析總是正確的,如: 我給他CN = blablabla/bla /OU=YEs/[email protected] 我只能得到: blablablabla/BLA 或者如果我givem他CN = blablabla/BLA/CT = URtest/OU = YES/EMAILADDRESS =你 我會得到:對進口.CRT文件 blablablabla/BLA – PythonNewbie