OpenSSH anahtar parmak izim neden AWS EC2 konsolu keypair parmak iziyle eşleşmiyor?


73

OpenSSH ortak anahtarımı AWS EC2’ye aktardığımda, AWS’nin gösterdiği parmak izini gördüğümle uyuşmuyor:

ssh-keygen -l -f my_key

Farklı bir uzunluktur ve farklı baytlara sahiptir.

Neden? Doğru anahtarı yüklediğimden eminim.

Yanıtlar:


102

AWS EC2, herkesin beklediği OpenSSH parmak izini değil, SSH2 parmak izini gösterir. Kullanıcı arayüzünde bunu söylemez.

Ayrıca , anahtarın AWS'de üretilip üretilmediğine veya indirdiğinize veya kendi genel anahtarınızı yükleyip yüklemediğinize bağlı olarak, tamamen farklı iki tür parmak izi gösterir.

İle oluşturulan parmak izleri

ssh-keygen -l -f id_rsa

olacak değil neyi EC2 gösterileri maç. Komutla bir parmak izi oluşturmak için AWS API araçlarını ec2-fingerprint-keykullanabilir veya bunu yapmak için OpenSSL kullanabilirsiniz.

Başlangıçta AWS'de bir anahtar oluşturduysanız, ancak daha sonra tekrar yüklediyseniz (örneğin, başka bir bölgeye), o zaman farklı bir parmak izi elde edersiniz; AWS'de üretildi.

Hey, hey? Bu ekran görüntüsünün içinde, farklı parmak izleri bulunan aynı anahtarın iki kopyası var.

Yukarıdakilerde, test-generatedAWS EC2 kullanılarak üretildi. test-generated-reuploadedAWS özel anahtarının oluşturduğu, çıkardığı ssh-keygen -yve tekrar yüklediği özel anahtarın genel anahtarıdır . Üçüncü anahtar, test-uploadedyerel olarak oluşturulan bir anahtardır ... ama yerel ssh-keygen -lparmak izi 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

Yerel olarak üretilen anahtarlar

AWS forumlarında Daniel tarafından gösterildiği gibi OpenSSL'yi kullanarak, yüklenen ortak anahtarlar (SSH2 MD5) için parmak izlerini göstermek üzere AWS tarafından kullanılan biçimde parmak izi oluşturmak için kullanabilirsiniz:

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

Kamuya ait bölümü özel anahtardan ayıklayarak ve aşağıdakileri kullanarak karma alarak oluşturulabilirler:

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

AWS'de oluşturulan anahtarlar

AWS konsolunda gösterilen anahtar parmak izi daha uzunsa, AWS'de oluşturulan özel bir anahtardı:

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

Bu durumda, Daniel tarafından AWS forumlarında da gösterilen aşağıdaki komutu, özel anahtara göre bir sha1 karma oluşturmak için kullanmanız gerekir:

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

indirilen AWS tarafından oluşturulan özel anahtar / sertifika dosyasında. Siz de OpenSSH formatına dönüştürdüğünüz tuşlar üzerinde çalışacaktır.

Referanslar

Görmek:



Mükemmel cevap! İlk olarak sshkomuta, daha yeni sürümleri ile md5 biçimini belirtmek için bir -E seçeneği gerekir: ssh-keygen -E md5 -l -f id_rsa.
RichVel

14

Yalnızca ortak anahtarlarınız varsa, AWS parmak izini aşağıdaki şekilde oluşturabilirsiniz:

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

2

AWS belgelerinde bir kaynak var http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

Anahtar çiftinizi AWS kullanarak oluşturduysanız, özel anahtar dosyasından parmak izi oluşturmak için OpenSSL araçlarını kullanabilirsiniz:

kopya

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

Anahtar çiftinizi üçüncü taraf bir araç kullanarak oluşturduysanız ve ortak anahtarı AWS’ye yüklediyseniz, yerel makinenizdeki özel anahtar dosyadan bir parmak izi oluşturmak için OpenSSL araçlarını kullanabilirsiniz:

kopya

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

Çıktı konsolda görüntülenen parmak iziyle eşleşmelidir.


2

Kullandığım şey bu:

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

Bu parmak izi, yukarıdakilerden bazılarına benzer şekilde ortak anahtardan üretir.


1

Python'u kullananlar için

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]))

Ne yazık ki bu benim için macOS 10.11'de en son Homebrew Python 2.7.13 kullanarak bu hatayı kullanarak başarısız oldu:ValueError: PEM encryption format not supported.
RichVel

@RichVel, hatayı yeniden oluşturamıyorum. Sadece bir sanalenv homebrew python 2.7.13 kullanarak macOS 10.12 üzerinde test ettim ve gayet iyi çalıştı. Tahmin etmek zorunda olsaydım, belki de kripto için bazı C gereksinimleri sizin için karşılanmadı. Belki bu yardımcı olabilir?
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

İşte kullandığım bir betik, env'ye betik yolunu ekleyin. Cevap için J.Doe teşekkürler



0

Java (BouncyCastle kullanarak). AWS konsolu daha kısa tuşlar gösteriyorsa, MD5 ile deneyin. (SHA1: 20 bayt, MD5: 16 bayt).

  /**
   * @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();
    }
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.