我有一個 PKCS12 文件,其中包含完整的憑證鍊和私鑰。我需要將它分成 3 個檔案作為一個應用程式。我需要的3個文件如下(PEM格式):
- 未加密的金鑰文件
- 客戶端證書文件
- CA 憑證檔案(根憑證和所有中間憑證)
這是我必須執行的常見任務,因此我正在尋找一種無需手動編輯輸出即可完成此操作的方法。
我嘗試了以下方法:
openssl pkcs12 -in <filename.pfx> -nocerts -nodes -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain -out <cacerts.cer>
這工作正常,但是,輸出包含包屬性,應用程式不知道如何處理這些屬性。
經過一番搜索,我找到了一個建議的解決方案,即透過 x509 傳遞結果來剝離包屬性。
openssl x509 -in <clientcert.cer> -out <clientcert.cer>
這可行,但我在 cacert 文件上遇到了問題。輸出檔案僅包含鏈中 3 個憑證之一。
有沒有辦法避免在 pkcs12 指令的輸出中包含套件屬性,或讓 x509 指令輸出包含所有憑證?此外,如果透過 x509 運行它是最簡單的解決方案,是否有辦法將 pkcs12 的輸出透過管道傳輸到 x509,而不是將檔案寫出兩次?
答案1
我最終找到的解決方案是透過 sed 進行管道傳輸。
openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>
答案2
另一個解決方案沒有sed
:
openssl pkcs12 -in <filename.pfx> -nocerts -nodes | openssl pkcs8 -nocrypt -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | openssl x509 -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>
答案3
單線awk
:
openssl pkcs12 -in key.pfx -nodes -out - | awk '/-----BEGIN/{a=1}/-----END/{print;a=0}a'
這將丟棄不在 PEM 開始行和結束行之間的所有輸出。 AWK 的功勞在於https://stackoverflow.com/q/17988756#comment29487454_17988834
答案4
剛剛嘗試使用
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>
以純格式匯出鏈,而無需鏈中每個項目的標題。在這台 Windows NT 伺服器上,我只匯出了鏈中的第一項,而不是我期望的兩項。相反,我只是最終使用
openssl pkcs12 -in <filename.pfx> -cacerts -chain -nokeys -nodes -out <cacerts.cer>
並使用記事本編輯文件以刪除不需要的文字。不優雅?是的,但它得到了所需的結果。