我怎样才能将一个CA证书包分成不同的文件?

我正在使用OpenSSL,需要一个理智的默认CA列表。 我正在使用Mozilla的受信任CA列表,如cURL所捆绑的 。 但是,我需要拆分这个CA证书包,因为OpenSSL文档说 :

如果CApath不是NULL,则它指向包含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的要求,即每个证书都在一个单独的文件中? 如果哈希也可以完成(如果需要的话,如果所有的证书都在单独的文件中,我可以自己写一个脚本来完成)。

你可以用awk把这个bundle拆分成一个合适的目录:

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

然后,通过运行OpenSSL附带的c_rehash实用程序来创建OpenSSL所需的链接:

 c_rehash . 

注意:在非Linux平台上使用“gawk” – 如上所述依赖于GNU特定功能。

只是提供一个替代方案; 面对同样的问题,我结束了与csplit:

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

如果您想从多证书PEM中获取单个证书,请尝试:

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

资源