長い話を短く

長い話を短く

質問とても簡単です:

(秘密鍵)とは何ですか?タイプそして(彼ら仕様- 現在許可されている形式、構文)SSHを開く

「次によって生成されたキー」に対するあいまいな答えssh-keygenは許可されていません。私も知っています。これはPEMと呼ばれ、次のヘッダー(RSA、DSA、ECDSAバリアント)があります。

-----BEGIN RSA PRIVATE KEY-----

その他の形式については後述する。プロトコルキーそして拡張してopenssh。また、Ed25519マニュアルに記載されているようにキーのデフォルトとして使用され、タイトル(パスワードに関係なく)が表示されます。

-----BEGIN OPENSSH PRIVATE KEY-----

RSA1SSHv1プロトコルと一緒に消える必要があるいくつかのレガシーキーもありますが、ヘッダーで識別できるようになりました。

SSH PRIVATE KEY FILE FORMAT 1.1

他の人はいますか?別のキーの詳細な説明を探しています。マニュアルページまたはSSH用RFCで(これまで)明示的に指定されたものが見つかりませんでした。

これボーナス質問(答えは必要ありませんが、あなたの洞察に感謝します):

openssh()はすべてのダミーファイルをデコードし、正しいヘッダーがなくてもパスワードを要求します。その理由は何ですか?


脚注:もともと投稿された質問openssh-unix-dev リストしかし、まだ答えがないので、誰もが答えることができれば、この素晴らしいコミュニティを試してみたいと思います。

ベストアンサー1

長い話を短く

@forcefsckの最も有用なコメントです。残念ながら、彼は答えを書いていないので、賞金を授与することはできません。簡単に言えば、答えは次のようになります。プロトン交換膜+RSA1+質問で説明されている新しいopenSSH形式の主な問題はPEMです。

長いフォーマットとボーナス

OpenSSHは、すべての失敗()に固有の戻り値を持つopenSSL(PEM_read_bio_PrivateKey())パーサーを使用します。NULL失敗した場合、openSSHは無効なパスワードのためだと思います。

OpenSSLなし

私はOpenSSLサポート(設定オプション)なしでOpenSSHを構築しようとしましたが、--without-openssl動作は「正しい」です。

# ./ssh-add <(echo "")
Error loading key "/dev/fd/63": invalid format

OpenSSLを使用した修正

もう一つはそれを解決する方法です。 pokeはERR_get_error()関数とその友達から来ており、これによりさまざまなエラーを区別することができます。

パスワードエラーエラー

# ./ssh-add /tmp/rsa
140480353842840:error:0906A068:lib(9):func(106):reason(104):pem_lib.c:457:
Enter passphrase for /tmp/rsa: 
140480353842840:error:06065064:lib(6):func(101):reason(100):evp_enc.c:592:
140480353842840:error:0906A065:lib(9):func(106):reason(101):pem_lib.c:482:

理由:PEM_R_BAD_PASSWORD_READ、、、PEM_R_BAD_BASE64_DECODEPEM_R_BAD_DECRYPT

解析エラーコード

# ./ssh-add <(echo "")
139656018548376:error:0906D06C:lib(9):func(109):reason(108):pem_lib.c:701:Expecting: ANY PRIVATE KEY

またはこれ:

140654301202072:error:0906D066:lib(9):func(109):reason(102):pem_lib.c:809:

理由: PEM_R_NO_START_LINE、、PEM_R_BAD_END_LINEしかし、より多くの可能性があります。

解決策?

さらにOpenSSLエラーチェックを追加すると、「フォーマット」エラーとして表示するエラーと「無効なパスワード」として表示するエラーを選択できます。位置は3800付近の形状線にありますsshkey_parse_private_pem_fileblob()sshkey.c

unsigned long e = ERR_get_error();
if (ERR_GET_REASON(e) == PEM_R_NO_START_LINE ||
    ERR_GET_REASON(e) == PEM_R_BAD_END_LINE) {
        r = SSH_ERR_INVALID_FORMAT;
} else {
        r = SSH_ERR_KEY_WRONG_PASSPHRASE;
}

おすすめ記事