SSH-PK-Authenticationで後で使用するためにPKCS12ファイルから公開鍵/秘密鍵を抽出します


194

PKCS#12SSH-Public-Key-Authenticationで後で使用するために、ファイルから公開鍵と秘密鍵を抽出したいと思います。

現在、私はssh-keygenを介し.ssh/authorized_keyて、クライアント側のどこかにそれぞれキーを生成しています。

将来的には、PKCS#12コンテナーのキーを使用するため、最初に公開キーを抽出してからPKCS#12.ssh/authorized_keysファイルに配置します。これを介して動作させる機会はありますopensslか?鍵はPKCS#12ssh公開鍵認証と互換性がありますか?

回答:


283

次のコマンドを使用して、PKCS#12コンテナから公開鍵/秘密鍵を抽出できます。

  • PKCS#1秘密鍵

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • 証明書:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    

7
コマンドは機能しますが、秘密鍵はPKCS1形式でエクスポートされ、PKCS8が必要です...これを取得するために欠けているオプションはありますか?たとえば、「------ BEGIN RSA PRIVATE KEY -----」をエクスポートしますが、「----- BEGIN PRIVATE KEY -----」が必要です
edthethird

4
そのためには、次のことを試してみてくださいopenssl rsa -in privateKey.pem -out private.pem
フランソワ

27
@edthethird:PKCS8を取得するには、-nodesフラグを追加します
Christopher K.

7
パスワードなしでエクスポートするには、を追加し-passout pass:ます。これは、パラメーターがpass:mypasswordの形式であることを想定しています。 stackoverflow.com/a/27497899/206277
nidheeshdas

2
@ChristopherK。ありがとう!それは私にとって良いものでした。追加-nodesするとキーが正しくエクスポートされる
TecHunter

85

これは、少しのフォーマット変換で可能です。

opensshが使用できる形式で秘密鍵を抽出するには、以下を使用できます。

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

秘密鍵を公開鍵に変換するには:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

公開鍵をopensshが使用できる形式で抽出するには、次を使用できます。

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

2
ありがとうございました!最初の行は私が必要としたものでした。暗号化されていないキーだけなので、ほとんどのCDN自動システムを介してインストールできます。
BTC 2017年

1
@PhilipRego公開鍵と秘密鍵が混同されていると思います。RSA公開鍵は2つの値、「e」は公開指数、「n」は係数-どちらも鍵の秘密部分とともに保存されます。
ryanc 2017

16

OpenSSHはそのままではPKCS#12ファイルを使用できません。他の人が示唆したように、OpenSSLの土地からOpenSSHに移動するPEM形式で秘密鍵を抽出する必要があります。ここで述べた他の解決策は私にはうまくいきません。私はOS X 10.9 Mavericks(現時点では10.9.3)を「事前にパッケージ化された」ユーティリティ(OpenSSL 0.9.8y、OpenSSH 6.2p2)で使用しています。

まず、OpenSSHで直接使用されるPEM形式の秘密鍵を抽出します。

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

パスワードで秘密鍵を暗号化することを強くお勧めします:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

明らかに、コマンドラインでプレーンテキストのパスワードを書くことも安全ではないので、履歴から最後のコマンドを削除するか、そこに到達しないことを確認する必要があります。シェルによって方法は異なります。コマンドの前にスペースを付けると、コマンドがBashや他の多くのシェルの履歴に保存されないようにすることができます。Bashの履歴からコマンドを削除する方法もここにあります:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

または、別の方法でOpenSSLに秘密鍵のパスワードを渡すこともできますパスフレーズの引数については、OpenSSLのドキュメントをご覧ください。

次に、authorized_keysファイルに追加できるOpenSSH公開鍵を作成します。

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

何の| openssl rsaために?
Snekse 2015

1
@Snekseそれは出力に秘密鍵だけがあることを確認します。私の場合、それは~/.ssh/id_rsa`|なしでバッグ属性のようないくつかの「残骸」を持つIDファイル()を作成します。openssl rsa`。IDSファイルを使用するOpenSSHやその他のユーティリティはその粗末を処理できると思いますが(私は試していません)、必要なデータのみを提供するためだけに使用され、それ以外のものは特にセキュリティに関するものである場合は特にそうです。
2015

1
この回答は私がターミナルでPEM形式の秘密鍵にアクセスするのにopenssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
役立ち

7

解決策1:

jksからP12を抽出する

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

P12からPEMを抽出し、CRTファイルからファイルとPEMを編集します

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

jksからキーを抽出する

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

解決策2:

PEMとencryptedPrivateKeyをtxtファイルに抽出します `` `

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

privateKeyを復号化する

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key

1
質問に答えるとき、コマンドが何であるかを強調するのに役立ちます。コマンドの前後に3つのバッククォートを追加して、 `` `echo hello```がになるようにしecho helloます。
PatS 2018年

2

更新:私の回答は、BryKKanによるhttps://unix.stackexchange.com / ...のよく説明された質問のほんの一部にすぎないことに気付きました

以下がその抜粋です。

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>

3
いくつかの説明を追加すると、この回答がより便利になります。
mx0 2018年

0

私の知る限り、PKCS#12は証明書/公開/秘密鍵ストアにすぎません。PKCS#12ファイルから公開鍵を抽出した場合、OpenSSHは、PEM形式で抽出されている限り、それを使用できます。ssh-public-key認証に使用するためには、対応する秘密鍵(これもPEM内にある)も必要であることをすでにご存じでしょう。


0

受け入れられた答えは正しいコマンドです。キーを抽出するときに、PEMパスワード("Enter PEM pass phrase:")を空白のままにすると、完全なキーは抽出されず、のみlocalKeyIDが抽出されます。完全なキーを取得するには、次のコマンドを実行してPEMパスワードを指定する必要があります。

パスワードのインポートに関しては、実際のパスワードを指定する"Enter Import Password:"ことも、このパスワードを空白のままにすることもできます。

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem

1
それは答えではなく、受け入れられた答えに対するコメントであるべきです。
Styx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.