Почему мой отпечаток ключа OpenSSH не совпадает с отпечатком пары ключей консоли AWS EC2?

73

Когда я импортирую свой открытый ключ OpenSSH в набор ключей AWS EC2, отпечаток, который показывает AWS, не совпадает с тем, что я вижу:

ssh-keygen -l -f my_key

Это разная длина и разные байты.

Почему? Я уверен, что я загрузил правильный ключ.

Крейг Рингер
источник

Ответы:

102

AWS EC2 показывает отпечаток SSH2, а не отпечаток OpenSSH, который ожидают все. Это не говорит об этом в пользовательском интерфейсе.

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

Отпечатки пальцев, созданные с

ssh-keygen -l -f id_rsa

не будет соответствовать тому, что показывает EC2. Вы можете использовать инструменты AWS API для создания отпечатка пальца с помощью ec2-fingerprint-keyкоманды или использовать OpenSSL для этого.

Обратите внимание, что если вы изначально сгенерировали ключ в AWS, но затем загрузили его снова (скажем, в другой регион), то вы получите другой отпечаток, потому что для этого потребуется отпечаток RSA SSH2, а не sha1, который он показывает для ключей, которые вы генерируется на AWS.

Весело, эй? Этот снимок экрана содержит две копии одного и того же ключа с разными отпечатками пальцев

Выше test-generatedбыло сгенерировано использование AWS EC2. test-generated-reuploadedявляется открытым ключом из закрытого ключа AWS, сгенерированного, извлеченного ssh-keygen -yи загруженного снова. Третий ключ, test-uploadedэто локально сгенерированный ключ ... но локальный ssh-keygen -lотпечаток b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea.

$ ssh-keygen -l -f theprivatekey
2048 b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea
$ openssl pkey -in theprivatekey -pubout -outform DER | openssl md5 -c
Enter pass phrase for id_landp:
(stdin)= 91:bc:58:1f:ea:5d:51:2d:83:d3:6b:d7:6d:63:06:d2

Ключи генерируются локально

Вы можете использовать OpenSSL, как продемонстрировал Дэниел на форумах AWS , для генерации отпечатка в форме, используемой AWS для отображения отпечатков пальцев для загруженных открытых ключей (SSH2 MD5), например:

7a:58:3a:a3:df:ba:a3:09:be:b5:b4:0b:f5:5b:09:a0

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

openssl pkey -in id_rsa -pubout -outform DER | openssl md5 -c

Ключи, сгенерированные на AWS

Если отпечаток ключа, показанный на консоли AWS, длиннее, то это был закрытый ключ, сгенерированный в AWS, например:

ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a

В этом случае вам нужно использовать следующую команду, также показанную Дэниелом на форумах AWS, для генерации хэша sha1 на основе закрытого ключа:

openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c

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

Рекомендации

Видеть:

Крейг Рингер
источник
4
Печально, что в AWS отсутствует ясность по этому поводу, они открывают потенциальное нарушение безопасности, затрудняя проверку ключей
Хайме Хаблутцель,
Отличный ответ! На начальной sshкоманде, с более поздними версиями вам нужен параметр -E , чтобы указать формат md5: ssh-keygen -E md5 -l -f id_rsa.
RichVel
14

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

ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
Дж. Доу
источник
2

Есть ресурс по документам AWS http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

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

копия

$ openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c

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

копия

$ openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c

Вывод должен соответствовать отпечатку пальца, отображаемому в консоли.

Goutham
источник
2

Это то, что я использую:

openssl rsa -RSAPublicKey_in -in <(ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM) -inform PEM -outform DER 2>/dev/null | openssl md5 -c | awk '{print $2}'

Это генерирует отпечаток пальца из открытого ключа, похожего на некоторые из вышеупомянутых.

Макс Мерфи
источник
1

Для тех из нас, кто использует Python

from Crypto.PublicKey import RSA
import hashlib
import base64

#Load your key from disk, or a string, or generate.
my_key = RSA.importKey(open(my_rsa_private_key, 'r').read())

# Normal md5 fingerprint
fp_plain = hashlib.md5(base64.b64decode(my_key.exportKey('OpenSSH').strip().split()[1].encode('ascii'))).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))

#AWS' EC2 fingerprint
public_only_key = RSA.importKey(my_key.exportKey('OpenSSH'))
fp_plain = hashlib.md5(public_only_key.exportKey('DER')).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))
Энди
источник
К сожалению, это не удалось для меня на MacOS 10.11 с использованием последней версии Homebrew Python 2.7.13, с этой ошибкой:ValueError: PEM encryption format not supported.
RichVel
@RichVel, я не могу воспроизвести ошибку. Я только что проверил на MacOS 10.12 с использованием доморощенного Python 2.7.13 в virtualenv, и он работал просто отлично. Если бы мне пришлось угадывать, может быть, некоторые требования C для pycrypto не были выполнены для вас. Может быть, это может помочь?
Энди
1
#!/bin/bash
key_file=$1
if [[ -n $key_pub_file ]]; then
    ssh-keygen -e -f $key_pub_file -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
else
    echo "pass the pub file as argument"
fi

Вот скрипт, который я использую, добавьте путь к скрипту в env. Спасибо J. Doe за ответ

Sand1512
источник
0

На всякий случай это может быть полезно: https://ssh-vault.com/post/fingerprint/

например:

$ ssh-vault -u bob -f

Распечатает отпечаток пальца для пользователя, соответствующего формату, который использует AWS.

nbari
источник
0

Java (используя BouncyCastle). Если на консоли AWS отображаются более короткие клавиши, попробуйте использовать MD5. (SHA1: 20 байт, MD5: 16 байт).

  /**
   * @return the SHA1 digest of the DER encoded RSA private key, e.g. 16:61:7d:1c:e7:d1:3b:93:b6:81:bf:64:7a:a0:38:fa:b6:6c:9e:e4
   */
  private String getAwsFingerprint(File rsaPrivateKeyFileFromAws) throws Exception {
    try(FileReader reader = new FileReader(rsaPrivateKeyFileFromAws)) {
      java.security.KeyPair keyPair = new JcaPEMKeyConverter().getKeyPair((PEMKeyPair) new PEMParser(reader).readObject());
      String hex = Hex.toHexString(MessageDigest.getInstance("SHA1").digest(keyPair.getPrivate().getEncoded()));
      StringBuilder sb = new StringBuilder();
      for(int i = 0; i < hex.length();) {
        sb.append(hex.charAt(i++));
        sb.append(hex.charAt(i++));
        sb.append(i % 2 == 0 && i != hex.length() ? ":" : "");
      }
      return sb.toString();
    }
  }
Reto Höhener
источник