Mengapa sidik jari kunci OpenSSH saya tidak cocok dengan sidik jari keypair konsol AWS EC2?

73

Ketika saya mengimpor kunci publik OpenSSH saya ke kunci AWS EC2 sidik jari yang menunjukkan AWS tidak cocok dengan apa yang saya lihat dari:

ssh-keygen -l -f my_key

Ini adalah panjang yang berbeda dan memiliki byte yang berbeda.

Mengapa? Saya yakin saya mengunggah kunci yang benar.

Craig Ringer
sumber

Jawaban:

102

AWS EC2 menunjukkan sidik jari SSH2, bukan sidik jari OpenSSH yang diharapkan semua orang. Itu tidak mengatakan ini di UI.

Ini juga menunjukkan dua jenis sidik jari yang sangat berbeda tergantung pada apakah kunci itu dihasilkan pada AWS dan diunduh, atau apakah Anda mengunggah kunci publik Anda sendiri.

Sidik jari dihasilkan dengan

ssh-keygen -l -f id_rsa

tidak akan cocok dengan yang ditunjukkan EC2. Anda bisa menggunakan alat AWS API untuk menghasilkan sidik jari dengan ec2-fingerprint-keyperintah, atau menggunakan OpenSSL untuk melakukannya.

Perhatikan bahwa jika Anda awalnya membuat kunci pada AWS, tetapi kemudian mengunggahnya lagi (katakanlah, ke wilayah lain) maka Anda akan mendapatkan sidik jari yang berbeda karena akan mengambil sidik jari RSA SSH2, daripada sha1 yang ditampilkan untuk kunci yang Anda dihasilkan pada AWS.

Menyenangkan, hai? Tangkapan layar ini memiliki dua salinan kunci yang sama di dalamnya dengan sidik jari yang berbeda

Di atas, test-generateddihasilkan menggunakan AWS EC2. test-generated-reuploadedadalah kunci publik dari kunci pribadi AWS yang dihasilkan, diekstraksi dengan ssh-keygen -ydan diunggah lagi. Kunci ketiga test-uploaded,, adalah kunci yang dibuat secara lokal ... tetapi ssh-keygen -lsidik jari lokal adalah 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

Kunci dihasilkan secara lokal

Anda dapat menggunakan OpenSSL, seperti yang ditunjukkan oleh Daniel di forum AWS , untuk menghasilkan sidik jari dalam bentuk yang digunakan oleh AWS untuk menampilkan sidik jari untuk kunci publik yang diunggah (SSH2 MD5), seperti:

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

Mereka dapat dihasilkan dengan mengekstraksi bagian publik dari kunci pribadi dan hashing menggunakan:

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

Kunci yang dihasilkan pada AWS

Jika sidik jari kunci yang ditunjukkan pada konsol AWS lebih panjang maka itu adalah kunci pribadi yang dihasilkan pada AWS, seperti:

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

Dalam hal ini Anda perlu menggunakan perintah berikut, juga ditunjukkan oleh Daniel di forum AWS, untuk menghasilkan hash sha1 berdasarkan kunci pribadi:

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

pada kunci pribadi / file sertifikat yang dihasilkan AWS yang diunduh. Ini akan bekerja pada kunci yang Anda konversi ke format OpenSSH juga.

Referensi

Lihat:

Craig Ringer
sumber
4
Sedih kejelasan yang hilang dari AWS tentang hal itu, mereka membuka potensi pelanggaran keamanan sehingga lebih sulit untuk memverifikasi kunci
Jaime Hablutzel
Jawaban bagus! Pada awal sshperintah, dengan versi yang lebih baru Anda membutuhkan pilihan -E untuk menentukan format md5: ssh-keygen -E md5 -l -f id_rsa.
RichVel
14

Jika Anda hanya memiliki kunci publik, Anda dapat membuat sidik jari AWS sebagai berikut:

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

Ada sumber di AWS docs http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

Jika Anda membuat pasangan kunci menggunakan AWS, Anda dapat menggunakan alat OpenSSL untuk menghasilkan sidik jari dari file kunci pribadi:

Salinan

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

Jika Anda membuat pasangan kunci Anda menggunakan alat pihak ketiga dan mengunggah kunci publik ke AWS, Anda dapat menggunakan alat OpenSSL untuk menghasilkan sidik jari dari file kunci pribadi di mesin lokal Anda:

Salinan

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

Outputnya harus sesuai dengan sidik jari yang ditampilkan di konsol.

Goutham
sumber
2

Inilah yang saya gunakan:

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

Ini menghasilkan sidik jari dari kunci publik, mirip dengan beberapa di atas.

Max Murphy
sumber
1

Bagi kita yang menggunakan 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
sumber
Sayangnya ini gagal untuk saya di macOS 10.11 menggunakan Homebrew Python 2.7.13 terbaru, dengan kesalahan ini:ValueError: PEM encryption format not supported.
RichVel
@RichVel, saya tidak bisa mereproduksi kesalahan. Saya baru saja menguji ada di macOS 10.12 menggunakan homebrew python 2.7.13 di virtualenv, dan itu bekerja dengan baik. Jika saya harus menebak, mungkin beberapa persyaratan C untuk pycrypto tidak terpenuhi untuk Anda. Mungkin ini bisa membantu?
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

Berikut ini adalah skrip yang saya gunakan, tambahkan path skrip ke env. Terima kasih kepada J. Nak untuk jawabannya

Sand1512
sumber
0

Java (menggunakan BouncyCastle). Jika konsol AWS menampilkan kunci yang lebih pendek, coba dengan MD5. (SHA1: 20 byte, MD5: 16 byte).

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