PFX からバッグ属性なしで PEM 形式で CA 証明書チェーンをエクスポートする方法

PFX からバッグ属性なしで PEM 形式で CA 証明書チェーンをエクスポートする方法

完全な証明書チェーンと秘密鍵を含む 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 つの証明書のうち 1 つしか含まれていません。

pkcs12 コマンドの出力に bag 属性を含めないようにする方法、または x509 コマンドの出力にすべての証明書を含める方法はありますか? さらに、x509 を介して実行するのがもっとも簡単な解決策である場合、ファイルを 2 回書き出す代わりに、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のbegin行とend行の間にないすべての出力を破棄します。AWKの功績はhttps://stackoverflow.com/q/17988756#comment29487454_17988834

答え4

使ってみた

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>

チェーンの各項目のヘッダーを除いたプレーンな形式でチェーンをエクスポートします。このWindows NTサーバーでは、チェーンの最初の項目のみがエクスポートされ、期待していた2つの項目はエクスポートされませんでした。代わりに、

openssl pkcs12 -in <filename.pfx> -cacerts -chain -nokeys -nodes -out <cacerts.cer>

そして、メモ帳でファイルを編集して、不要なテキストを削除します。洗練されていない?そうですが、必要な結果は得られました。

関連情報