У меня есть файл 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
поддерживает снятие отпечатков пальцев со стандартного ввода:
Обратите внимание, что эта команда не работает с закрытыми ключами, которые используют парольную фразу и не используют агента. Он должен работать с pem-файлами, созданными AWS или OpenStack, которые не используют парольные фразы.
Видеть https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin для получения дополнительной информации.
Вы получаете отпечаток пальца не из файла закрытого ключа, а из файла открытого ключа.
Фактически, ssh-keygen уже сказал вам об этом:
./query.pem не является файлом открытого ключа.
Запустите его против публичной половины ключа, и он должен работать.
В более общем плане
Подумайте об этом: причина существования отпечатка в том, что вы можете идентифицировать открытый ключ. Фактически, получение хэша закрытого ключа является потенциальной проблемой безопасности, помимо бесполезности для сервера (у которого даже нет рассматриваемого закрытого ключа).
Когда у вас есть открытый ключ, процесс заключается в том, чтобы убедиться, что клиент удерживает соответствующую частную половину. Поскольку вы уже знаете, какие ключи вы пытаетесь проверить, вам не нужен отпечаток пальца.