OpenSSH 키 지문이 AWS EC2 콘솔 키 쌍 지문과 일치하지 않는 이유는 무엇입니까?


73

OpenSSH 퍼블릭 키를 AWS EC2의 키링으로 가져올 때 AWS가 표시하는 지문이 내가 보는 것과 일치하지 않습니다.

ssh-keygen -l -f my_key

길이가 다르고 바이트가 다릅니다.

왜? 올바른 키를 올렸습니다.

답변:


102

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-generatedAWS 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 콘솔에 표시된 키 지문이 더 길면 다음과 같이 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 형식으로 변환 한 키에서도 작동합니다.

참고 문헌

보다:


4
AWS에서 슬픈 누락 된 선명도 그것에 대해, 그들은 키를 확인하기가 어려워 잠재적 인 보안 위반을 여는
제이미 Hablutzel을

좋은 답변입니다! 초기 ssh명령에서 최신 버전을 사용하는 경우 md5 형식을 지정하려면 -E 옵션이 필요합니다 ssh-keygen -E md5 -l -f id_rsa.
RichVel

13

퍼블릭 키만있는 경우 다음과 같이 AWS 지문을 생성 할 수 있습니다.

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

2

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

출력은 콘솔에 표시되는 지문과 일치해야합니다.


2

이것이 내가 사용하는 것입니다 :

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

위의 일부와 유사한 공개 키에서 지문을 생성합니다.


1

우리를 위해 파이썬을 사용하는 사람들

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

불행히도 최신 Homebrew Python 2.7.13을 사용하는 macOS 10.11에서는 다음과 같은 오류가 발생했습니다.ValueError: PEM encryption format not supported.
RichVel

@RichVel, 오류를 재현 할 수 없습니다. 방금 virtualenv에서 homebrew python 2.7.13을 사용하는 macOS 10.12에서 테스트했으며 정상적으로 작동했습니다. 내가 추측해야한다면, 아마도 pycrypto에 대한 C 요구 사항 중 일부가 충족되지 않았을 것입니다. 어쩌면 이것이 도움이 될까요?
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

다음은 내가 사용하는 스크립트입니다. env에 스크립트 경로를 추가하십시오. 답변을 해준 J.Doe에게 감사합니다


0

이것이 유용 할 수있는 경우를 대비하여 https://ssh-vault.com/post/fingerprint/

예를 들면 다음과 같습니다.

$ ssh-vault -u bob -f

AWS가 사용하는 형식과 일치하는 사용자 bob의 지문을 인쇄합니다.


0

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();
    }
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.