답변:
AWS EC2는 모든 사람이 기대하는 OpenSSH 지문이 아니라 SSH2 지문을 보여줍니다. UI에서는 이것을 말하지 않습니다.
또한 키가 AWS에서 생성되어 다운로드되었는지 또는 자신의 공개 키를 업로드했는지에 따라 완전히 다른 두 종류의 지문 이 표시됩니다.
지문으로 생성
ssh-keygen -l -f id_rsa
것 없는 어떤 EC2 쇼를 일치합니다. AWS API 도구를 ec2-fingerprint-key
사용 하여 명령 으로 지문을 생성 하거나 OpenSSL을 사용 하여 지문을 생성 할 수 있습니다.
원래 AWS에서 키를 생성했지만 다시 다른 지역에 키를 업로드 한 경우 키에 대해 표시되는 sha1이 아닌 SSH2 RSA 지문을 사용하므로 다른 지문 이 표시됩니다. 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 포럼 에서 Daniel이 시연 한대로 OpenSSL을 사용하여 다음과 같이 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
AWS 콘솔에 표시된 키 지문이 더 길면 다음과 같이 AWS에서 생성 된 개인 키입니다.
ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a
이 경우 AWS 포럼에서 Daniel이 표시 한 다음 명령을 사용하여 프라이빗 키를 기반으로 sha1 해시를 생성해야합니다.
openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c
다운로드 한 AWS 생성 개인 키 / 인증서 파일 OpenSSH 형식으로 변환 한 키에서도 작동합니다.
보다:
ssh
명령에서 최신 버전을 사용하는 경우 md5 형식을 지정하려면 -E 옵션이 필요합니다 ssh-keygen -E md5 -l -f id_rsa
.
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
출력은 콘솔에 표시되는 지문과 일치해야합니다.
우리를 위해 파이썬을 사용하는 사람들
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.
이것이 유용 할 수있는 경우를 대비하여 https://ssh-vault.com/post/fingerprint/
예를 들면 다음과 같습니다.
$ ssh-vault -u bob -f
AWS가 사용하는 형식과 일치하는 사용자 bob의 지문을 인쇄합니다.
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();
}
}