注意:这不是一个真正的问题,因为我已经find了答案,但是因为我在这里找不到它,所以我会发布它,这样可以使其他人受益。
问题:如何读取apache / mod_ssl指令SSLCACertificateFile使用的连接的PEM文件?
回答(原创) ( 来源 ):
cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
如果最后有一个空行,这可能会留下一个空文件,例如使用openssl pkcs7 -outform PEM -in my-chain-file -print_certs
。 为防止出现这种情况,请在打印之前检查行的长度:
cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {if(length($0) > 0) print > "cert" n ".pem"}'
回答29/03/2016 :
在@slugchewer 答案之后 , csplit
可能是一个更清晰的选项:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
awk片段用于提取不同的部分,但是您仍然需要知道哪个部分是key / cert /链。 我需要提取一个特定的部分,并在OpenSSL邮件列表中find它: http : //openssl.6102.n7.nabble.com/Convert-pem-to-crt-and-key-files-tp47681p47697.html
# Extract key openssl pkey -in foo.pem -out foo-key.pem # Extract all the certs openssl crl2pkcs7 -nocrl -certfile foo.pem | openssl pkcs7 -print_certs -out foo-certs.pem # Extract the textually first cert as DER openssl x509 -in foo.pem -outform DER -out first-cert.der
这是以前在StackOverflow上的答案 :
awk ' split_after == 1 {n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}' < $file
编辑29/03/2016 :请参阅@slugchewer 答案
split
命令在大多数系统上都可用,其调用可能更容易记住。
如果你有一个文件collection.pem
,你想分割成individual-*
文件,使用:
split -p "-----BEGIN CERTIFICATE-----" collection.pem individual-
如果你没有split
,你可以尝试csplit
:
csplit -f individual- collection.pem '/-----BEGIN CERTIFICATE-----/' '{*}'
如果您想从多证书PEM包中获取单个证书,请尝试:
$ openssl crl2pkcs7 -nocrl -certfile INPUT.PEM | \ openssl pkcs7 -print_certs | \ awk '/subject.*CN=host.domain.com/,/END CERTIFICATE/'
openssl
命令将处理一个PEM文件,并在每个证书之前用预先填写的"subject:"
和"issuer:"
行将其吐出。 如果您的PEM已经以这种方式格式化,那么您所需要的只是最终的awk
命令。 source1 , source2
另外值得注意的是, PEM文件只是BEGIN
/ END
块内部的密钥/证书集合,所以如果只有一个或两个有趣实体的单个文件,剪切/粘贴非常容易。