以下を使用した場合
openssl req -x509 -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes
private.pem
とpublic.pem
が表示されます
私が使うなら
ssh-keygen -t rsa -f rsa
rsa
とrsa.pub
を取得します
rsa
の形式からprivate.pem
に、またはその逆に変換することはできますか?
編集:より具体的には、
a)上記のコマンドでprivate.pem
とpublic.pem
を生成した場合、同等のrsa秘密鍵と公開鍵を取得するにはどうすればよいですか?
b)rsa
およびrsa.pub
を前提として、上記のopensslコマンドが受け取る追加のメタデータを知っている場合、x509キーを取得するにはどうすればよいですか?
Openssh形式からx509に戻る場合、理想的には同じキーファイルを戻す必要があります。
ここで少し不足しています。
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-user
とtest-user-cert.pem
の両方のファイルを保持することが重要であり、test-user.pub
は必要に応じてテストユーザーからいつでも再作成できます。
Opensshのssh-keygen
ツールがこれを行うことができます。
次のコマンドは、.pub
ファイルをpem
形式に変換します。
ssh-keygen -f rsa.pub -e -m pem
ssh-keygen
は、他のさまざまな形式への変換もサポートしています。詳細については、 man ページを参照してください。
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
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
私はその仕事のためのツールを見つけることができなかったので、私は手を汚し、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用です。
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
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