OpenSSLを使用したPKCS#12証明書のPEMへの変換


212

私はWindows 7でOpenSSL x64を使用していますが、これはGoogle Codeのopenssl-for-windowsからダウンロードしました。実行しようとしています:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" 

エラーが発生します。

unable to load private key

OpenSSLを使用してPKCS#12ストアからPEMの証明書を抽出するにはどうすればよいですか?


@jwwこの質問は3年以上前のものであるため、トピック外フラグを通知するのが少し遅れていると思います。
Dean MacGregor

ただの形式的なものなので、人々はその主題外を知っています。人々は同じオフトピックの質問をし、この質問を引用しています。話題から外れていると知らされていない人は、スタックオーバーフローについて質問し続けます。
16

2
@jwwリンクしたメタ質問で最も投票数の多い回答は、「DevOps質問はスタックオーバーフローで許可する必要がある」と述べています。私は、upvoteだろう答えは私のニーズに会ったので、(私のために、私はプログラミングされなかった、が、私が望んだ場合、私は簡単にプログラムの中で答えを組み込むことができる)
dcorking

回答:


534

試してください:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

その後、あなたは持っています:

  • newfile.crt.pem内の証明書
  • newfile.key.pem内の秘密鍵

証明書とキーを同じファイルに入れるには、以下を使用します

openssl pkcs12 -in path.p12 -out newfile.pem

PKCS#12パスワードをコマンドライン(スクリプトなど)から直接入力する必要がある場合は、次のコードを追加し-passin pass:${PASSWORD}ます。

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'

2
秘密鍵と証明書が同じ* .pemファイルに格納される可能性はありますか?
ラミス

18
はい、それは次のとおりですopenssl pkcs12 -in path.p12 -out newfile.pem
ジー・ビー

2
パスワードのインポートを要求します。それは何ですか ?
Saurabh Chandra Patel

4
@SaurabhChandraPatelは、証明書のパスワードを知っている必要があります。これは、忘れたパスワードを回復する手段ではありません
Dean MacGregor

2
-nodesを省略した場合、秘密鍵は抽出されません。
Meixner 2016年

22

パスワードを入力するだけです。次の構文を使用して、同じコマンドライン内で実行できます。

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]

次に、出力ファイルの秘密鍵を暗号化するためのパスワードの入力を求められます。暗号化されていない(平文)秘密鍵をエクスポートする場合は、上の行に「ノード」オプションを含めます。

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes

詳細:http : //www.openssl.org/docs/apps/pkcs12.html


16

Pythonを使用できる場合は、pyopensslモジュールがあればさらに簡単です。ここにあります:

from OpenSSL import crypto

# May require "" for empty password depending on version

with open("push.p12", "rb") as file:
    p12 = crypto.load_pkcs12(file.read(), "my_passphrase")

# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())

を使用fileしてファイルを開く理由はありますopenか?私はそれを将来使用するのでそれを理解したいだけです(
opensh

いいえ、違いはありません。あなたはただすることができますopen("push.p12", 'rb').read()
KVISH 2014年

2
Python 3を使用している場合は、おそらく内容をファイルwith open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))に書き込むwith open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))必要があります。つまり、証明書とキーを書き込みます。
アダムパーキン

上記の例を実行しているときに私のpython 3.7を使用していますが、私は以下の取得:「例外TypeError長さ1のバイトでなければならないのctype「シャアの初期化子を、ないstrが」私のパスワードを使用して、そこに何かが間違っているのです
getaglow

単一のコマンドを実行するだけでなく、ファイルを作成し、コードを入力して保存し、実行する方が「簡単」なのはなぜですか。
Torben Gundtofte-Bruun

3

私はPFXファイルを持っていて、NGINXのKEYファイルを作成する必要があったので、これを行いました:

openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes

次に、KEYファイルを編集して、までのすべてのコンテンツを削除する必要がありました-----BEGIN PRIVATE KEY-----。その後、NGINXはKEYファイルを受け入れました。


0

パスワードなしのPEMファイルが必要な場合は、このソリューションを使用できます。

秘密鍵と証明書をコピーして同じファイルに貼り付け、.pemとして保存するだけです。

ファイルは次のようになります。

-----BEGIN PRIVATE KEY-----
............................
............................
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...........................
...........................
-----END CERTIFICATE-----

これが、HTTPSのシスコデバイスに証明書をアップロードする唯一の方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.