我正在使用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
资源