如何将CA证书捆绑包拆分为单独的文件?

Cor*_*lks 11 linux ssl openssl

我正在使用OpenSSL,需要一个理智的默认CA列表.我正在使用由cURL捆绑的 Mozilla的可信CA列表.但是,我需要拆分此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
Run Code Online (Sandbox Code Playgroud)

但指定包含该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
Run Code Online (Sandbox Code Playgroud)

我认为这是因为我的文件夹不符合文档要求的内容(即包含PEM格式的CA证书的目录,每个文件包含一个证书,由哈希值命名).我的目录只有一组证书.

如何拆分我的证书包以遵守OpenSSL的请求,即每个证书都在一个单独的文件中?如果可以进行散列也可以获得奖励(尽管如果需要的话,如果所有证书都在单个文件中,我可以自己编写脚本).

Mrt*_*ten 16

您可以awk像这样在适当的目录中拆分包:

awk 'BEGIN {c=0;} /BEGIN CERT/{c++} { print > "cert." c ".pem"}' < ca-bundle.pem 
Run Code Online (Sandbox Code Playgroud)

然后,通过运行c_rehashOpenSSL附带的实用程序来创建OpenSSL想要的链接:

c_rehash .
Run Code Online (Sandbox Code Playgroud)

注意:在非Linux平台上使用'gawk' - 如上所述依赖于GNU特定功能.


小智 9

只是提供一个替代方案; 面对同样的问题,我最终得到了csplit:

csplit -k -f bar foo.pem '/END CERTIFICATE/+1' {10}
Run Code Online (Sandbox Code Playgroud)