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


73

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

ssh-keygen -l -f my_key

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

どうして?正しいキーをアップロードしたと確信しています。

回答:


102

AWS EC2は、誰もが期待するOpenSSHフィンガープリントではなく、SSH2フィンガープリントを表示します。UIではこれを言っていません。

また、AWSでキーを生成してダウンロードしたかどうか、または独自の公開キーをアップロードしたかどうかに応じて、2つのまったく異なる種類のフィンガープリントを示します。

で生成された指紋

ssh-keygen -l -f id_rsa

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

もともとAWSでキーを生成した後、別のリージョンにアップロードした場合は、キーに対して表示されるsha1ではなくSSH2 RSAフィンガープリントを取得するため、異なるフィンガープリントが取得されることに注意してくださいAWSで生成されます。

楽しいね? このスクリーンショットには、指紋が異なる同じキーのコピーが2つあります

上記でtest-generatedは、AWS EC2を使用して生成されました。test-generated-reuploadedAWSで生成、抽出、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

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

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フォーラムでダニエルが示した次のコマンドを使用して、秘密キーに基づいて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

14

公開キーしかない場合は、次のように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

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

残念ながら、これは最新の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要件の一部が満たされていません。たぶんこれは役立つかもしれませんか?
アンディ

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

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.