¿Por qué la huella digital de mi clave OpenSSH no coincide con la huella digital del par de claves de la consola AWS EC2?

73

Cuando importo mi clave pública OpenSSH en el llavero de AWS EC2, la huella digital que muestra AWS no coincide con lo que veo en:

ssh-keygen -l -f my_key

Tiene una longitud diferente y tiene bytes diferentes.

¿Por qué? Estoy seguro de que cargué la clave correcta.

Craig Ringer
fuente

Respuestas:

102

AWS EC2 muestra la huella digital SSH2, no la huella digital OpenSSH que todos esperan. No dice esto en la interfaz de usuario.

También muestra dos tipos completamente diferentes de huellas digitales, dependiendo de si la clave se generó en AWS y se descargó, o si cargó su propia clave pública.

Huellas digitales generadas con

ssh-keygen -l -f id_rsa

será no coincidir con lo que se muestra EC2. Puede usar las herramientas de la API de AWS para generar una huella digital con el ec2-fingerprint-keycomando o usar OpenSSL para hacerlo.

Tenga en cuenta que si originalmente generó una clave en AWS, pero luego la cargó nuevamente (por ejemplo, a otra región), obtendrá una huella digital diferente porque tomará la huella digital SSH2 RSA, en lugar de la sha1 que muestra para las claves que generado en AWS.

Diversión, ¿eh? Esta captura de pantalla tiene dos copias de la misma clave con diferentes huellas digitales

En lo anterior, test-generatedse generó utilizando AWS EC2. test-generated-reuploadedes la clave pública de la clave privada AWS generada, extraída ssh-keygen -yy cargada nuevamente. La tercera clave, test-uploadedes una clave generada localmente ... pero la ssh-keygen -lhuella digital local es 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

Claves generadas localmente

Puede usar OpenSSL, como lo demostró Daniel en los foros de AWS , para generar la huella digital en la forma utilizada por AWS para mostrar las huellas digitales de las claves públicas cargadas (SSH2 MD5), como:

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

Se pueden generar extrayendo la parte pública de la clave privada y troceándola con:

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

Claves generadas en AWS

Si la huella digital de la llave que se muestra en la consola de AWS es más larga, entonces fue una clave privada generada en AWS, como:

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

En este caso, debe utilizar el siguiente comando, también mostrado por Daniel en los foros de AWS, para generar un hash sha1 basado en la clave privada:

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

en el archivo de clave / certificado privado generado por AWS descargado. También funcionará en las claves que convirtió al formato OpenSSH.

Referencias

Ver:

Craig Ringer
fuente
44
Triste la falta de claridad de AWS al respecto, están abriendo una posible violación de seguridad que dificulta la verificación de las claves
Jaime Hablutzel
¡Gran respuesta! En el primer sshcomando, con versiones más recientes que necesita una opción -E para especificar el formato md5: ssh-keygen -E md5 -l -f id_rsa.
RichVel
14

Si solo tiene claves públicas, puede generar la huella digital de AWS de la siguiente manera:

ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
J. Doe
fuente
2

Hay un recurso en documentos de AWS http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

Si creó su par de claves con AWS, puede usar las herramientas de OpenSSL para generar una huella digital del archivo de clave privada:

Copiar

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

Si creó su par de claves con una herramienta de terceros y cargó la clave pública en AWS, puede usar las herramientas de OpenSSL para generar una huella digital desde el archivo de clave privada en su máquina local:

Copiar

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

El resultado debe coincidir con la huella digital que se muestra en la consola.

goutham
fuente
2

Esto es lo que uso:

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

Esto genera la huella digital de la clave pública, similar a algunas de las anteriores.

Max Murphy
fuente
1

Para aquellos de nosotros que usamos 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]))
Andy
fuente
Desafortunadamente, esto falló para mí en macOS 10.11 usando el último Homebrew Python 2.7.13, con este error:ValueError: PEM encryption format not supported.
RichVel
@RichVel, no puedo reproducir el error. Acabo de probarlo en macOS 10.12 usando homebrew python 2.7.13 en virtualenv, y funcionó bien. Si tuviera que adivinar, tal vez algunos de los requisitos de C para pycrypto no se cumplieron para usted. Tal vez esto podría ayudar?
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

Aquí hay un script que uso, agregue la ruta del script a env. Gracias a J.Doe por la respuesta.

Arena1512
fuente
0

Java (usando BouncyCastle). Si la consola de AWS muestra teclas más cortas, intente con MD5. (SHA1: 20 bytes, MD5: 16 bytes).

  /**
   * @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
fuente