2014-05-14 155 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 
相关问题