2014-05-14 150 views
6

我正在使用OpenSSL,需要一個理智的默認CA列表。我正在使用Mozilla的受信任CA列表,如bundled by cURL。但是,我需要拆分CA證書的這種捆綁,因爲OpenSSL documentation says如何將CA證書包拆分爲單獨的文件?

如果CApath不爲空,它指向包含PEM格式的CA證書的目錄。每個文件都包含一個CA證書。這些文件由CA主題名稱哈希值查找,因此必須可用。

例如,直接使用ca-bundle.crt文件正常工作:

openssl-1.0.1g> ./apps/openssl s_client -connect www.google.com:443 -CAfile /home/user/certs/ca-bundle.crt 
... 
    Verify return code: 0 (ok) 
--- 
DONE 

但指定包含ca-bundle.crt文件的目錄不起作用:

openssl-1.0.1g> ./apps/openssl s_client -connect www.google.com:443 -CApath /opt/aspera/certs 
    Verify return code: 20 (unable to get local issuer certificate) 
--- 
DONE 

我想這是因爲我的文件夾不符合文檔要求的內容(即包含PEM格式的CA證書的目錄,每個文件包含一個由哈希值命名的證書)。我的目錄只有一捆證書。

如何拆分我的證書包以遵守OpenSSL的要求,即每個證書都在單個文件中?如果哈希也可以完成(如果需要的話,如果所有證書都在單個文件中,我可以編寫一個腳本來自己完成)。

回答

11

您可以awk拆捆,這樣,在適當的目錄:

awk 'BEGIN {c=0;} /BEGIN CERT/{c++} { print > "cert." c ".pem"}' < ca-bundle.pem 

然後,創建的OpenSSL希望通過運行c_rehash工具自帶的OpenSSL的鏈接:

c_rehash . 

注意:在非linux平臺上使用'gawk' - 如上所述依賴於GNU特定功能。

+0

適合我。應該是一個被接受的答案。 –

7

只是給一個替代方案;面臨着同樣的問題,我結束了csplit可:

csplit -k -f bar foo.pem '/END CERTIFICATE/+1' {10} 
0

如果你想獲得一個證書了多證書PEM的,請嘗試:

$ awk '/subject.*CN=host.domain.com/,/END CERTIFICATE/' INPUT.PEM 

source

0

下紅寶石-script會將捆綁包(包含一個或多個證書)拆分爲散列之後命名的文件 - 在大多數情況下,步驟爲c_rehash

若要將cd放入正確的目錄(例如/etc/ssl/certs/),並以您的證書包路徑作爲唯一參數運行腳本。例如:ruby /tmp/split-certificates.rb ca-root-nss.crt

#!/usr/bin/env ruby 

require 'openssl' 

blob = IO.binread(ARGV[0]) # Read the entire file at once 

DELIMITER = "\n-----END CERTIFICATE-----\n" 
blobs = blob.split(DELIMITER) 

blobs.each do |blob| 
    blob.strip! 
    blob += DELIMITER # Does not break DER 
    begin 
     cert = OpenSSL::X509::Certificate.new blob 
    rescue 
     puts "Skipping what seems like junk" 
     next 
    end 
    begin 
     # XXX Need to handle clashes, suffix other than 0 
     filename=sprintf("%x.0", cert.subject.hash) 
     File.open(filename, 
      File::WRONLY|File::CREAT|File::EXCL) do |f| 
      f.write(blob) 
     end 
    rescue Errno::EEXIST 
     puts "#{filename} already exists, skipping" 
    end 
end 
相關問題