web-dev-qa-db-ja.com

opensslとopenssh間のキーの変換

以下を使用した場合

openssl req -x509  -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes

private.pempublic.pemが表示されます

私が使うなら

ssh-keygen -t rsa -f rsa

rsarsa.pubを取得します

rsaの形式からprivate.pemに、またはその逆に変換することはできますか?

編集:より具体的には、

a)上記のコマンドでprivate.pempublic.pemを生成した場合、同等のrsa秘密鍵と公開鍵を取得するにはどうすればよいですか?

b)rsaおよびrsa.pubを前提として、上記のopensslコマンドが受け取る追加のメタデータを知っている場合、x509キーを取得するにはどうすればよいですか?

Openssh形式からx509に戻る場合、理想的には同じキーファイルを戻す必要があります。

62
anshul

ここで少し不足しています。

ssh-keygenを使用すると、公開鍵をSSH形式からOpenSSLに適したPEM形式に変換できます。秘密鍵は通常、すでに両方に適したPEM形式で保存されています。

ただし、表示するOpenSSLコマンドは自己署名certificateを生成します。この証明書は、OpenSSHが伝統的に何かに使用するものではありません。そして、それは明らかに公開鍵だけと同じものではありません。

OpenSSHは証明書もサポートしていますが、このサポートを使用していない可能性があります。また、これらの証明書はX.509ではないため、OpenSSLと互換性がありません。

証明書には他のどこにも存在しない情報が含まれており、各証明書は一意であり、自由に再作成することはできません。つまり、OpenSSLとOpenSSHの両方に同じキーを使用する場合は、秘密キーに加えてX.509証明書を保存する必要があります。


秘密鍵を共有したいだけの場合、サンプルコマンドによって生成されたOpenSSL鍵はprivate.pemに保存され、すでに(最近の)OpenSSHと互換性のあるPEM形式である必要があります。 OpenSSH互換の公開鍵を抽出するには、次のコマンドを実行します。

ssh-keygen -f private.pem -y > private.pub

OpenSSHから始めて、(何らかの理由で)自己署名証明書を使用してOpenSSL側に進む場合は、次のようにします。

$ ssh-keygen -f test-user
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in test-user.
Your public key has been saved in test-user.pub.
The key fingerprint is:
ff:36:f1:74:c7:0d:4e:da:79:5c:96:27:2c:2c:4e:b6 naked@tink
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|           . .  .|
|          + o =.+|
|        S+ o * B+|
|         .E o = B|
|          .  + o.|
|           .o .  |
|           ...   |
+-----------------+
$ openssl req -x509 -days 365 -new -key test-user -out test-user-cert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
$ ls -l test-user*
-rw------- 1 naked naked 1675 Mar 18 21:52 test-user
-rw-r--r-- 1 naked naked 1229 Mar 18 21:53 test-user-cert.pem
-rw-r--r-- 1 naked naked  392 Mar 18 21:52 test-user.pub

これらから、test-usertest-user-cert.pemの両方のファイルを保持することが重要であり、test-user.pubは必要に応じてテストユーザーからいつでも再作成できます。

42
Nakedible

Opensshのssh-keygenツールがこれを行うことができます。

次のコマンドは、.pubファイルをpem形式に変換します。

ssh-keygen -f rsa.pub -e -m pem

ssh-keygenは、他のさまざまな形式への変換もサポートしています。詳細については、 man ページを参照してください。

39
user10211

OpenSSLの新しいバージョン(少なくとも1.0.1以上)では、キーにPKCS#8形式を使用します。

したがって、コマンドを使用して証明書から公開鍵を抽出した場合

openssl x509 -in certificate.pem -noout -pubkey >pubkey.pem

次のコマンドを使用して、authorized_keysエントリに変換する必要があります

ssh-keygen -i -m PKCS8 -f pubkey.pem

-out OpenSSLのreqコマンドのオプションは、公開鍵ではなく証明書要求を生成します。

ssh-keygenのインポート機能で理解できるPKCS#8形式の公開鍵を抽出するには、次のコマンドを使用します。

openssl req -in public.pem -noout -pubkey
10
Victor Wagner

2048ビットの公開RSA鍵は、次のコマンドを使用してX.509 PEM形式からOpenSSH形式に変換できます(cf. answer )。リンクされた回答からの情報が与えられれば、他の方向に変換を書くことは難しくありません。

echo -n "ssh-rsa " > rsa2048.pub
grep -v -- ----- rsa2048.pem | base64 -d | dd bs=1 skip=32 count=257 status=none | xxd -p -c257 | sed s/^/00000007\ 7373682d727361\ 00000003\ 010001\ 00000101\ / | xxd -p -r | base64 -w0 >> rsa2048.pub
echo >> rsa2048.pub
5
mkalkov

私はその仕事のためのツールを見つけることができなかったので、私は手を汚し、OpenSSHソースコードといくつかのオンラインPEM/DERデバッガーを読んで手作業でいくつか書きました。

PKCS8、PKCS1(RSAのみ)、SEC1(ECDSAのみ)、および任意のサイズのRSA鍵とECDSA P-256およびP-384の「独自の」OpenSSH形式の間で変換するためにそれを書きました。

インストール

node.js(そして私はそれをブラウザに移植する作業をしています)、それであなたは最初にそれをインストールする必要があります:

その後:

npm install -g rasha eckles ssh-to-jwk jwk-to-ssh

RashaはRSA用、EcklesはECDSA用です。

PEMからOpenSSH

RSA

rasha privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_rsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_rsa.pub

ECDSA

eckles privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_ecdsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_ecdsa.pub

OpenSSHからPEM

RSA

ssh-to-jwk id_rsa > privkey.jwk.json

rasha privkey.jwk.json > privkey.pem

rasha privkey.jwk.json public > pubkey.pem

ECDSA

ssh-to-jwk id_ecdsa > privkey.jwk.json

eckles privkey.jwk.json > privkey.pem

eckles privkey.jwk.json public > pubkey.pem
2
CoolAJ86

私はこれに何とかWindowsツールputtygen.exeを使用しました:

enter image description here

そう:

  1. 秘密鍵をputtygenにロードします(パスフレーズチャレンジに回答)
  2. 読み込まれたら、上の画像のように選択します変換-> Export OpenSSHキーに名前を付けると、機能するはずです。
1
yonsk