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.
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:
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-key
kullanabilir 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?
Yukarıdakilerde, test-generated
AWS EC2 kullanılarak üretildi. test-generated-reuploaded
AWS özel anahtarının oluşturduğu, çıkardığı ssh-keygen -y
ve tekrar yüklediği özel anahtarın genel anahtarıdır . Üçüncü anahtar, test-uploaded
yerel olarak oluşturulan bir anahtardır ... ama yerel ssh-keygen -l
parmak 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
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 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.
Görmek:
ssh
komuta, 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
.
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.
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.
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]))
ValueError: PEM encryption format not supported.
Bunun faydalı olabileceği durumlarda: https://ssh-vault.com/post/fingerprint/
Örneğin:
$ ssh-vault -u bob -f
AWS'nin kullandığı formatla eşleşen kullanıcı bob için parmak izi yazdırır.
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();
}
}