Назад | Перейти на главную страницу

Отпечаток ключа SSH PEM

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

$ 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.

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

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

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

$ 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)

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

$ 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 <<< чтобы 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 для получения дополнительной информации.

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

Фактически, ssh-keygen уже сказал вам об этом:

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

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

В более общем плане

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

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