SSH 用の秘密鍵 + 公開鍵ペアの生成: ssh-keygen と openssl の違いは何ですか?

SSH 用の秘密鍵 + 公開鍵ペアの生成: ssh-keygen と openssl の違いは何ですか?

SSH 認証に使用する秘密鍵と公開鍵のペアを作成したいと思います。

以下の違いが分かりません:

openssl genrsa -out MyPrivateKey 4096
openssl rsa -in MyPrivateKey -pubout -out MyPublicKey

まず秘密 RSA キーを作成し、それから公開キーを導出します。または、

ssh-keygen -b 4096 -t rsa -f MyFancyKey

これにより、ファイル 'MyFancyKey' に秘密 RSA キーが作成され、 'MyFancyKey.pub' に対応する公開キーが作成されます。

秘密鍵の構造は多少似ているように見えますが、 で作成されたものは次opensslのように始まります。
-----BEGIN RSA PRIVATE KEY-----

そして、次の文ssh-keygenで始まります:
-----BEGIN OPENSSH PRIVATE KEY-----

これら 2 種類のキーには根本的な違いがありますか?


対応する公開鍵には次のものがopenssl含まれます。

-----BEGIN PUBLIC KEY-----
  ...base64 encoded...
-----BEGIN PUBLIC KEY-----

一方、次のものにはssh-keygen1 行だけが含まれています。
ssh-rsa XXXXXX...base64 encoded...XXXXX [email protected]

これらは本質的に同じ種類のデータですが、形式が異なりますか? それとも、本当に互換性がないのでしょうか?

SSHに関連してこれがどのように機能するかを完全に理解しようとしています。たとえば、ユーザー名、コンピューター名、ローカルネットワーク名がそのキーに含まれているのはなぜですか。通常、SSHにアクセスするために使用されるのではないですか。他のコンピューターですか? 自分のユーザー名ではなく、そのコンピューター上のユーザー名で。

答え1

秘密鍵

これら 2 種類のキーには根本的な違いがありますか?

いいえ、本質的には同じデータです。

  • BEGIN RSA PRIVATE KEY「PKCS#1」または「PEM」キー形式を示します。これは、ASN.1 DERシリアル化構造のBase64エンコードです。これは、RSAパラメータ(edpqなど)。

    この形式は、後に S/MIME (ASN.1 DER の使用) となった PEM 電子メール セキュリティの取り組みから生まれたもので、SSL/TLS やさまざまな汎用 RSA でよく使用されていました。

    長い間、これは OpenSSH の主キー形式でもありました (OpenSSH はすでに OpenSSL の暗号化コードを使用しているため、「キーの読み込み」および「キーの書き込み」機能も便利に使用できました)。つまり、 を使用してssh-keygen -m PEMそのようなキーを生成または変換できます。

  • BEGIN PRIVATE KEY「PKCS#8」キー形式(暗号化されていない)を示します。その内容は PEM 形式と非常に似ており、同じ RSA パラメータが別の構造内にネストされており、これが実際に RSA キーであることを示しています。

    PKCS#8 は、特に PEM 形式のより現代的な代替として意図されています。PEM と比較すると、PKCS#8 形式は「ペイロード」(キー アルゴリズム、暗号化) を外部の Base64 ラッパーからより明確に分離します。すべてのメタデータが構造内に含まれるようになったため、新しいキー タイプへの更新が容易になりました。新しい形式では、暗号化されたキーに対してより優れた暗号と KDF もサポートされます。

    OpenSSH もこの形式を認識します (キーの読み込みに OpenSSL を使用しているため)。また、最近のバージョンではこの形式も作成できると思います。

  • BEGIN OPENSSH PRIVATE KEYは、OpenSSH によって OpenSSH 用に発明された形式であり、PEM/PKCS 形式とは異なり、データ構造に SSHv2 パケットのシリアル化を使用します (DER や ASN.1 は使用されません)。

    OpenSSH が現在この形式を使用する理由の 1 つは、OpenSSL に完全に依存することを回避し、OpenSSL がそれらのキーの読み込み/保存を実装するのを待たずに新しいキー アルゴリズムを追加できるようにするためです。これは、PKIX が新しいアルゴリズムごとに ASN.1 OID と構造を標準化するのを待つことも意味します (それ以外は SSH とはまったく関係ありません)。

    たとえば、OpenSSL が Ed25519 を完全にサポートするまでにはしばらく時間がかかりましたが、その間、OpenSSH は実際の計算にも Ed25519 キー ファイルの読み込み/保存にも OpenSSL の libcrypto を使用できませんでした。これがこの形式の作成を促した理由です。

    OpenSSH 形式のもう 1 つの利点は、パスフレーズ暗号化キーが暗号化キーの導出に bcrypt を使用することです。当時、PEM 形式は非常に弱い (つまり、ブルートフォース攻撃が容易な) KDF に制限されており、PKCS#8 でもわずかに劣る PKBDF2 のみがサポートされていました。

  • PuTTY には独自の.ppk形式があり、そのほとんどはテキストベースです。

    その利点は、プライベートパラメータのみを選択的に暗号化するため、別の .pub ファイルが必要ないことです。一方、以前の PKCS 形式と後の OpenSSH 形式はどちらもすべてを暗号化するか何も暗号化しないかのどちらかであるため、ロックを解除するためのパスフレーズを要求する前にキーを提供できるように .pub ファイルが必要になります。

    これらすべての形式間で変換するために使用できます/usr/bin/puttygen

  • Java ソフトウェアは、ネイティブの「Java キーストア」形式であるため、PKCS#12 (PFX) 形式を使用する場合があります。また、一部のソフトウェアでは、SSH.COM と呼ばれる標準形式を使用する場合もあります。

参照:OpenSSH 公開鍵ファイル形式?

公開鍵

これらは本質的に同じ種類のデータですが、形式が異なりますか?

はい、本質的には同じデータです。

  • BEGIN PUBLIC KEYPKCS#8でもあると思います。Base64の中には、DERシリアル化されたASN.1構造があり、それがRSAキーであることを示し、その後にキーパラメータが続きます(e)。

  • 1行形式は部分的にOpenSSH固有のものですが、中心となるBase64エンコードされたデータはSSHv2プロトコル自体(「回線上」)で使用されるものとまったく同じ形式です。ご想像のとおり、エンコードされたデータはSSHv2パケットシリアル化を使用していますが、それでも同じRSAを保持しています。そしてe価値観。

参照:OpenSSH 公開鍵ファイル形式?

たとえば、なぜ私のユーザー名、コンピュータ名、ローカルネットワーク名がそのキーに含まれているのか

コメントです長いファイルがある場合に、この公開鍵を他の公開鍵と区別するのに役立ちますauthorized_keys

関連情報