web-dev-qa-db-ja.com

OpenSSHキーのフィンガープリントがAWS EC2コンソールのキーペアのフィンガープリントと一致しないのはなぜですか?

OpenSSH公開キーをAWS EC2のキーリングにインポートすると、AWSが表示するフィンガープリントが、表示されるものと一致しません。

ssh-keygen -l -f my_key

長さが異なり、バイトも異なります。

どうして?正しい鍵をアップロードしたはずです。

82
Craig Ringer

AWS EC2はSSH2フィンガープリントを表示しますが、誰もが期待するOpenSSHフィンガープリントではありません。 UIではこのことを述べていません。

また、キーがAWSで生成されてダウンロードされたか、または独自の公開キーをアップロードしたかによって、2種類の完全に異なる種類のフィンガープリントも表示されます。

で生成された指紋

ssh-keygen -l -f id_rsa

EC2が示すものと一致しません。 AWS APIツールを使用してec2-fingerprint-keyコマンドでフィンガープリントを生成するか、OpenSSLを使用してフィンガープリントを生成できます。

最初にAWSでキーを生成したが、それを再度(たとえば、別のリージョンに)アップロードした場合、異なるフィンガープリントを取得することに注意してください。 AWSで生成したキーに対して表示するsha1ではなく、SSH2 RSAフィンガープリントを使用します。

楽しいねFun? This screenshot has two copies of the same key in it with different fingerprints

上記では、AWS EC2を使用してtest-generatedが生成されました。 test-generated-reuploadedは、AWSが生成した秘密鍵からの公開鍵であり、ssh-keygen -yで抽出されて再度アップロードされます。 3番目のキー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

ローカルで生成されたキー

OpenSSLを AWSフォーラムでDanielがデモンストレーション として使用して、アップロードされた公開鍵(SSH2 MD5)の指紋を表示するためにAWSが使用する形式で指紋を生成できます。

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形式に変換したキーでも機能します。

参考文献

見る:

112
Craig Ringer

公開鍵しかない場合は、AWSフィンガープリントを次のように生成できます。

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

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
goutham

これは私が使用するものです:

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

これにより、上記の一部と同様に、公開鍵からフィンガープリントが生成されます。

2
Max Murphy
#!/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に感謝

1
Sand1512

これが便利な場合に備えて: https://ssh-vault.com/post/fingerprint/

例えば:

$ ssh-vault -u bob -f

AWSが使用しているフォーマットに一致するユーザーbobのフィンガープリントを印刷します。

1
nbari

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

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();
    }
  }
0
Reto Höhener