Отпечаток пальца PEM ssh ключ

30

У меня есть PEM-файл, который я добавляю в работающий ssh-agent:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

Как я могу получить отпечаток ключа (который я вижу в ssh-agent) прямо из файла? Я знаю, ssh-keygen -l -f some_keyработает для "нормальных" ключей SSH, но не для файлов PEM.

Если я попробую ssh-keygen для файла .pem, я получу:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

Этот ключ начинается с:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

в отличие от «обычного» закрытого ключа, который выглядит так:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.
неизвестный
источник
Почему вы думаете, что это не работает для файлов PEM? Какую ошибку вы получаете, когда пытаетесь это сделать? .ssh/id_rsaФайл , созданный с помощью OpenSSH с использованием всех значений по умолчанию ЯВЛЯЕТСЯ PEM файл. Закрытые ключи по умолчанию закодированы в PEM. Фактически вы можете использовать ключи RSA, которые вы генерируете с OpenSSL напрямую с OpenSSH.
Зоредаче
обновленное описание с выводом ssh-keygen на .pem
неизвестно
(поздно, но некроед) @Zoredache: До 7.2 (в 2016 году, после этого Q) ssh-keygen -lне может прочитать файл приватного ключа, хотя другие операции ssh-keygenssh*) делают. Но когда ssh-keygen генерирует ключ, он записывает как файл privatekey, например, так id_rsa и соответствующий файл publickey с .pubдобавлением, например id_rsa.pub. Позднее ssh-keygen -l будет пытаться добавлять .pubк названию файла и чтение этого файла ОткрытыйКлюч.
dave_thompson_085

Ответы:

34

Если вы хотите получить отпечаток потерянного файла открытого ключа, вы можете восстановить его из файла закрытого ключа :

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

Тогда вы сможете установить публичный отпечаток:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

На некоторых более новых системах это печатает отпечаток пальца SHA256 ключа. Вы можете распечатать MD5-отпечаток ключа (двоеточие), используя опцию -E:

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

Или как одна командная строка :

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)
ominug
источник
Ответ @ MikeD на самом деле является «правильным» ответом на то, что искал ОП (и что я искал). AWS предоставляет отпечатки пальцев в формате, который он показал, с парами цифр, разделенных двоеточиями. Его решение (взятое с предоставленной страницы AWS) также генерирует отпечаток пальца таким же образом, чтобы вы могли правильно проверить.
Майк Уильямсон
50

AWS « Проверка отпечатка вашей пары ключей » предоставляет два однострочника, которые решают проблему в зависимости от того, как был создан ваш ключ.

Если вы создали свою пару ключей с помощью AWS:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Или, если вы создали свою пару ключей с помощью стороннего инструмента:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(отпечатки пальцев отредактированы в выводе выше)

Майк Д
источник
6

Вот один вкладыш, который должен делать то, что вы хотите, не требуя создания файла открытого ключа локально.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

При этом используется строка bash here <<<, чтобы stdin был доступен в виде обычного файла ( /dev/stdin), а не канала, поскольку он ssh-keygenбудет работать только с файлом.

Начиная с версии 7.2 openssh ssh-keygen поддерживает снятие отпечатков пальцев со стандартного ввода:

  • ssh-keygen (1): разрешить дактилоскопию со стандартного ввода, например, "ssh-keygen -lf -"

Обратите внимание, что эта команда не работает с закрытыми ключами, которые используют парольную фразу и не используют агент. Он должен работать с файлами pem, сгенерированными AWS или OpenStack, которые не используют парольные фразы.

См. Https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin для получения дополнительной информации.

Htaccess
источник
В заметках о выпуске ничего не сказано, но, согласно источнику, по состоянию на 7.2 -lтакже поддерживается чтение файла privatekey (но не из stdin).
dave_thompson_085
2

Вы не получаете отпечаток пальца из файла закрытого ключа, но из файла открытого ключа.

На самом деле, ssh-keygen уже сказал вам следующее:

./query.pem не является файлом с открытым ключом.

Запустите его против публичной половины ключа, и он должен работать.

Вообще говоря

Подумайте об этом: причина существования отпечатка пальца заключается в том, что вы можете идентифицировать открытый ключ. Фактически, получение хэша закрытого ключа является потенциальной проблемой безопасности, поскольку он бесполезен для сервера (который даже не имеет рассматриваемого закрытого ключа).

Когда у вас есть открытый ключ, процесс должен убедиться, что клиент удерживает соответствующую частную половину. Поскольку вы уже знаете, какие ключи вы пытаетесь проверить, вам не нужен отпечаток пальца.

Stephane
источник
Проблема в том, что у меня нет открытого ключа для этого закрытого :( И еще одна вещь, ssh-keygenработает с файлом закрытого ключа RSA, который имеет дополнительную информацию в начале (см. Мой первоначальный пост), но не об этом. .
Неизвестный
Тогда с этим ничего не поделаешь. Вы не можете получить открытую половину ключа из приватной части больше, чем вы можете сделать наоборот.
Стефан
3
Это неверно Как @ominug указал выше, ssh-keygen -yfделает это.
Стив Беннетт
4
@Stephane Несмотря на правильность на чистом уровне RSA, на практике способ хранения ключей в спецификации PKCS в формате для закрытых ключей фактически включает оба ключа. Сравните спецификации для частного против публичного
Håkan Lindqvist
«Вы не можете получить открытую половину ключа из приватной части ...» - о да, вы, вероятно, можете. Возьмите модуль из закрытого ключа и используйте 65537 в качестве открытого показателя, и есть вероятность, что вы нашли открытый ключ.
Джим Флуд