web-dev-qa-db-ja.com

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-keygenのものには1行しか含まれていませんが、
ssh-rsa XXXXXX...base64 encoded...XXXXX [email protected]

これらは本質的に同じ種類のデータですが、フォーマットが異なりますか?それとも本当に互換性がありませんか?

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

1
RocketNuts

秘密鍵

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

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

  • BEGIN RSA PRIVATE KEYは、「PKCS#1」または「PEM」キー形式を示します。これは、ASN.1DERシリアル化構造のBase64エンコーディングです。これは、RSAパラメータ(neを含む基本的なASN.1シーケンスです。 )、dpqなど)。

    OpenSSHは実際にはhasも従来からこの形式を使用していました。これは、OpenSSLの暗号化コードをすでに使用しているため、「キーの読み込み」および「キーの書き込み」機能も使用されていたためです。便利に利用できます。

    これは、ssh-keygen -m PEMを使用してそのようなキーを生成または変換できることを意味します。

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

    PEMと比較して、PKCS#8形式は、「ペイロード」(キーアルゴリズム、暗号化)を外部のBase64ラッパーからより明確に分離します。ただし、データの意味は変わりません。

    OpenSSHもこの形式を認識します(キーの読み込みにOpenSSLを使用しているため)。

  • BEGIN OPENSSH PRIVATE KEYは、OpenSSH用にOpenSSHによって発明された形式です。今回は、DERの代わりにSSHv2パケットのシリアル化を使用します。

    OpenSSHはこの形式を使用するようになり、OpenSSLに完全に依存することを回避したり、PKIXがASN.1シリアル化形式を標準化するのを待たずに新しいキーアルゴリズムを追加したりできます(それ以外の場合はSSHとはまったく関係ありません)。次に、OpenSSLがそれを実装するのを待ちます。

  • PuTTYには独自の.ppk形式があります。/usr/bin/puttygenを使用して、それらすべての間で変換できます。

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

公開鍵

これらは本質的に同じ種類のデータですが、フォーマットが異なりますか?

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

  • BEGIN PUBLIC KEYもPKCS#8であると私は信じています。したがって、Base64内には、RSAキーとして識別するDERシリアル化されたASN.1構造があり、その後にキーパラメータが続きます(n e

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

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

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

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

2
user1686