Какие ключи принимает openSSH?

Вопрос прост:

Какие бывают (закрытые) ключи типов и (их спецификация - формат, синтаксис) принимаются текущим openSSH ?

Расплывчатый ответ «ключи, сгенерированные ssh-keygen » не принимаются - я знаю Это. Они называются PEM с такими заголовками (варианты RSA, DSA, ECDSA):

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

Другой формат описан в PROTOCOL.key и является расширением openssh . Он также используется по умолчанию для ключей Ed25519 , как указано в руководстве и (независимо от парольной фразы) помечен заголовком:

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

Существуют также устаревшие ключи RSA1 , которые должны исчезнуть сегодня с протоколом SSHv1, но может быть идентифицирован по заголовку:

SSH PRIVATE KEY FILE FORMAT 1.1

Есть ли другие? Я ищу более подробное описание других ключей. Я не нашел (пока) это явно указано ни на одной странице руководства, ни в каком-либо RFC для SSH.

бонусный вопрос (не нужно отвечать, но я был бы признателен за понимание):

В чем причина ( openssh ) декодирования каждого фиктивного файла и запроса кодовую фразу, даже если у нее нет правильного заголовка?


Сноска: Вопрос изначально был размещен в списке openssh-unix-dev , но пока без ответа, поэтому я пытаюсь это сделать классное сообщество, если есть кто сможет ответить.

0
23.12.2015, 20:20
1 ответ

TL;DR

Самые полезные комментарии от @forcefsck. К сожалению, он не заполнил ответ, поэтому я не смог присудить вознаграждение. Вкратце, ответ: PEM + RSA1 + новый формат openSSH, который описан в вопросе, и основная проблема была с PEM.

The long one & Bonus

OpenSSH использует парсер из openSSL (PEM_read_bio_PrivateKey()), который имеет единственное возвращаемое значение для всех неудач (NULL) и если он не работает, openSSH ожидает, что это произошло из-за неправильной парольной фразы.

Без OpenSSL

Я только что попробовал собрать OpenSSH без поддержки OpenSSL (--without-openssl опция configure) и поведение "правильное":

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

Исправить с OpenSSL

Другое дело - как это исправить. Тычок исходит от функции 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_DECODE, PEM_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 должно дать нам возможность выбирать, какую ошибку мы хотим пометить как ошибку "формата", а какую как "плохую парольную фразу". Это находится в функции sshkey_parse_private_pem_fileblob() в sshkey.c на строке около 3800.

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;
}
2
28.01.2020, 02:35

Теги

Похожие вопросы