Dlaczego mój odcisk palca klucza OpenSSH nie pasuje do odcisku palca kluczy konsoli AWS EC2?

73

Kiedy importuję mój klucz publiczny OpenSSH do kluczy AWS EC2, odcisk palca, który pokazuje AWS, nie pasuje do tego, co widzę:

ssh-keygen -l -f my_key

Ma inną długość i różne bajty.

Dlaczego? Jestem pewien, że przesłałem prawidłowy klucz.

Craig Ringer
źródło

Odpowiedzi:

102

AWS EC2 pokazuje odcisk palca SSH2, a nie odcisk palca OpenSSH, którego wszyscy się spodziewają. Nie mówi tego w interfejsie użytkownika.

Pokazuje również dwa zupełnie różne rodzaje odcisków palców w zależności od tego, czy klucz został wygenerowany w AWS i pobrany, czy też przesłałeś własny klucz publiczny.

Odciski palców wygenerowane za pomocą

ssh-keygen -l -f id_rsa

nie będzie pasować do tego, co pokazuje EC2. Możesz użyć narzędzi AWS API do wygenerowania odcisku palca za pomocą ec2-fingerprint-keypolecenia lub użyć OpenSSL, aby to zrobić.

Pamiętaj, że jeśli pierwotnie wygenerowałeś klucz w AWS, ale następnie załadowałeś go ponownie (powiedzmy, do innego regionu), otrzymasz inny odcisk palca, ponieważ pobierze odcisk palca RSH SSH2, a nie sha1, który pokazuje dla kluczy wygenerowane na AWS.

Zabawa, hej? Ten zrzut ekranu zawiera dwie kopie tego samego klucza z różnymi odciskami palców

Powyżej test-generatedzostał wygenerowany przy użyciu AWS EC2. test-generated-reuploadedto klucz publiczny z klucza prywatnego wygenerowanego przez AWS, wyodrębnionego ssh-keygen -yi przesłanego ponownie. Trzeci klucz test-uploadedto lokalnie generowany klucz ... ale lokalny ssh-keygen -lodcisk palca to 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

Klucze generowane lokalnie

Możesz użyć OpenSSL, jak zademonstrował Daniel na forach AWS , do wygenerowania odcisku palca w formie używanej przez AWS do wyświetlenia odcisków palców dla przesłanych kluczy publicznych (SSH2 MD5), takich jak:

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

Można je wygenerować, wyodrębniając część publiczną z klucza prywatnego i mieszając go za pomocą:

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

Klucze generowane w AWS

Jeśli odcisk klucza pokazany na konsoli AWS jest dłuższy, to był to klucz prywatny wygenerowany w AWS, na przykład:

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

W takim przypadku musisz użyć następującego polecenia, również pokazanego przez Daniela na forach AWS, aby wygenerować skrót sha1 na podstawie klucza prywatnego:

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

na pobranym pliku klucza prywatnego / certyfikatu wygenerowanym przez AWS. Będzie działać również na kluczach przekonwertowanych na format OpenSSH.

Bibliografia

Widzieć:

Craig Ringer
źródło
4
Smutne, że brakuje mu jasności ze strony AWS, otwierają potencjalne naruszenie bezpieczeństwa, utrudniając weryfikację kluczy
Jaime Hablutzel
Świetna odpowiedź! Na początkowym sshpolecenia, z nowszych wersjach trzeba opcji -E Aby określić format md5: ssh-keygen -E md5 -l -f id_rsa.
RichVel,
13

Jeśli masz tylko klucze publiczne, możesz wygenerować odcisk palca AWS w następujący sposób:

ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
J. Doe
źródło
2

Istnieje dokument na AWS http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

Jeśli utworzyłeś parę kluczy za pomocą AWS, możesz użyć narzędzi OpenSSL do wygenerowania odcisku palca z pliku klucza prywatnego:

Kopiuj

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

Jeśli utworzyłeś parę kluczy za pomocą narzędzia innej firmy i przesłałeś klucz publiczny do AWS, możesz użyć narzędzi OpenSSL do wygenerowania odcisku palca z pliku klucza prywatnego na komputerze lokalnym:

Kopiuj

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

Dane wyjściowe powinny być zgodne z odciskiem palca wyświetlanym w konsoli.

goutham
źródło
2

Oto, czego używam:

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}'

To generuje odcisk palca z klucza publicznego, podobnie jak niektóre z powyższych.

Max Murphy
źródło
1

Dla tych z nas, którzy używają Pythona

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]))
Andy
źródło
Niestety to nie udało mi się na MacOS 10.11 przy użyciu najnowszych Homebrew Python 2.7.13, z tego błędu:ValueError: PEM encryption format not supported.
RichVel
@RichVel, nie mogę odtworzyć błędu. Właśnie przetestowałem na macOS 10.12 przy użyciu homebrew python 2.7.13 w virtualenv, i działało dobrze. Gdybym musiał zgadywać, może niektóre wymagania C dotyczące pycrypto nie zostały spełnione. Może to może pomóc?
Andy,
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

Oto skrypt, którego używam, dodaj ścieżkę skryptu do env. Dziękuję J.Doe za odpowiedź

Piasek1512
źródło
0

Java (przy użyciu BouncyCastle). Jeśli konsola AWS wyświetla krótsze klawisze, spróbuj z MD5. (SHA1: 20 bajtów, MD5: 16 bajtów).

  /**
   * @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
źródło