Чому мій відбиток ключа 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 шоу. Ви можете використовувати інструменти API AWS для створення відбитка пальця за допомогою ec2-fingerprint-keyкоманди, або використовувати OpenSSL для цього.

Зауважте, що якщо ви спочатку згенерували ключ на AWS, але потім знову його завантажили (скажімо, в інший регіон), ви отримаєте інший відбиток пальця, оскільки він буде брати відбиток SSH2 RSA, а не sha1, який він показує для ваших ключів генерується на AWS.

Весело, га? На цьому скріншоті є дві копії одного ключа в ньому з різними відбитками пальців

У вищесказаному test-generatedгенерували за допомогою AWS EC2. test-generated-reuploadedце відкритий ключ із приватного ключа, що генерується, витягується 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 з цього приводу, вони відкривають потенційне порушення безпеки, що ускладнює перевірку ключів
Jaime Hablutzel

Чудова відповідь! На початковій sshкоманді, з більш пізніми версіями вам потрібен параметр -E , щоб вказати формат md5: ssh-keygen -E md5 -l -f id_rsa.
RichVel

13

Якщо у вас є лише відкриті ключі, ви можете створити відбиток 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

Вихід повинен відповідати відбитку пальців, який відображається на консолі.


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, використовуючи homebrew python 2.7.13 у virtualenv, і він працював чудово. Якби мені довелося здогадуватися, можливо, деякі вимоги С щодо пікрипто для вас не були виконані. Може, це може допомогти?
Енді

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. Дякую Дж.Доу за відповідь


0

Про всяк випадок це може бути корисним: https://ssh-vault.com/post/fingerprint/

наприклад:

$ ssh-vault -u bob -f

Буде надруковано відбиток пальців для користувача bob, що відповідає формату, який використовує AWS.


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();
    }
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.