如何拆分PEM文件

注意:这不是一个真正的问题,因为我已经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命令。
    • awk命令将吐出与CN(通用名称)string匹配的单个PEM。

    source1 , source2

    另外值得注意的是, PEM文件只是BEGIN / END块内部的密钥/证书集合,所以如果只有一个或两个有趣实体的单个文件,剪切/粘贴非常容易。