Shell

如何拆分 PEM 文件

  • February 21, 2022

**注意:**這不是一個真正的問題,因為我已經找到了答案,但是由於我在這裡不容易找到它,所以我會發布它,以便它可以使其他人受益。

**問題:**如何讀取連接的 PEM 文件作為 apache/mod_ssl 指令SSLCACertificateFile使用的文件?

答案(原文)來源):

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 片段用於提取不同的部分,但您仍然需要知道哪個部分是密鑰/證書/鏈。我需要提取一個特定的部分,並在 OpenSSL 郵件列表中找到它: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

split命令在大多數係統上都可用,並且它的呼叫可能更容易記住。

如果您有collection.pem要拆分為individual-*文件的文件,請使用:

split -p "-----BEGIN CERTIFICATE-----" collection.pem individual-

如果你沒有split,你可以嘗試csplit

csplit -s -z -f individual- collection.pem '/-----BEGIN CERTIFICATE-----/' '{*}'

-s跳過文件大小的列印輸出

-z不創建空文件

引用自:https://serverfault.com/questions/391396