Когда я импортирую свой открытый ключ OpenSSH в связку ключей AWS EC2, отпечаток, который показывает AWS, не соответствует тому, что я вижу:
ssh-keygen -l -f my_key
Это другая длина и разные байты.
Зачем? Я уверен, что загрузил правильный ключ.
AWS EC2 показывает отпечаток SSH2, а не отпечаток OpenSSH, которого все ожидают. В пользовательском интерфейсе этого не сказано.
Это также показывает два совершенно разных типа отпечатков пальцев в зависимости от того, был ли ключ создан на AWS и загружен, или вы загрузили собственный открытый ключ.
Отпечатки пальцев, созданные с помощью
ssh-keygen -l -f id_rsa
воля не соответствует тому, что показывает EC2. Вы можете использовать инструменты API AWS для создания отпечатка пальца с помощью ec2-fingerprint-key
или используйте для этого OpenSSL.
Обратите внимание: если вы изначально сгенерировали ключ на AWS, но затем загрузили его снова (скажем, в другой регион), вы получите другой отпечаток пальца потому что он будет принимать отпечаток SSH2 RSA, а не sha1, который он показывает для ключей, созданных на AWS.
Весело, эй?
В приведенном выше описании test-generated
был создан с использованием AWS EC2. test-generated-reuploaded
открытый ключ из сгенерированного AWS закрытого ключа, извлеченный с помощью ssh-keygen -y
и загрузил снова. Третий ключ, test-uploaded
, является локально сгенерированным ключом ... но локальный ssh-keygen -l
отпечаток пальца 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, вы загружаете только открытый ключ, и AWS показывает хэш MD5 открытого ключа.
Вы можете использовать OpenSSL как продемонстрировал Даниэль на форумах AWS, чтобы сгенерировать отпечаток в форме, используемой AWS для отображения отпечатков для загруженных открытых ключей (SSH2 MD5), например:
7a:58:3a:a3:df:ba:a3:09:be:b5:b4:0b:f5:5b:09:a0
Если у вас есть закрытый ключ, вы можете сгенерировать отпечаток пальца, извлекая открытую часть из закрытого ключа и хэшируя ее, используя:
openssl pkey -in id_rsa -pubout -outform DER | openssl md5 -c
Если у вас есть только открытый ключ, и он находится в формате OpenSSH, вам нужно сначала преобразовать его в PEM, а затем в DER, а затем в хеш, используя:
ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl pkey -pubin -outform DER | openssl md5 -c
Когда вы создаете пару ключей на AWS, AWS показывает хэш SHA1 закрытого ключа, который длиннее, например:
ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a
В этом случае вам нужно использовать следующую команду, также показанную Дэниелом на форумах AWS, для генерации хэша sha1 на основе закрытого ключа:
openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c
в загруженном файле закрытого ключа / сертификата, созданного AWS. Он также будет работать с ключами, которые вы преобразовали в формат OpenSSH. Однако для этого требуется, чтобы у вас был закрытый ключ, поскольку хеш - это закрытый ключ. Вы не можете сгенерировать хеш локально, если у вас есть только открытый ключ.
Видеть:
Если у вас есть только открытые ключи, вы можете сгенерировать отпечаток AWS следующим образом:
ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
В документации AWS есть ресурс http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints
Если вы создали свою пару ключей с помощью AWS, вы можете использовать инструменты OpenSSL для создания отпечатка пальца из файла закрытого ключа:
Копировать
$ openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
Если вы создали свою пару ключей с помощью стороннего инструмента и загрузили открытый ключ в AWS, вы можете использовать инструменты OpenSSL для создания отпечатка пальца из файла закрытого ключа на вашем локальном компьютере:
Копировать
$ openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c
Вывод должен соответствовать отпечатку пальца, отображаемому в консоли.
Вот что я использую:
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}'
Это генерирует отпечаток из открытого ключа, аналогично некоторым из вышеперечисленных.
На всякий случай это может пригодиться: https://ssh-vault.com/post/fingerprint/
например:
$ ssh-vault -u bob -f
Распечатает отпечаток пальца пользователя bob, соответствующий формату, который использует AWS.
Для тех из нас, кто использует 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]))
#!/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
Вот сценарий, который я использую, добавляю путь к сценарию в env. Спасибо J.Doe за ответ
Java (с использованием BouncyCastle). Если консоль AWS отображает более короткие ключи, попробуйте MD5. (SHA1: 20 байт, MD5: 16 байт).
/**
* @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();
}
}