OpenSSH公開キーをAWS EC2のキーリングにインポートすると、AWSが表示するフィンガープリントが、表示されるものと一致しません。
ssh-keygen -l -f my_key
長さが異なり、バイトも異なります。
どうして?正しい鍵をアップロードしたはずです。
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?
上記では、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で生成された秘密キーでした。
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形式に変換したキーでも機能します。
見る:
公開鍵しかない場合は、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}'
これにより、上記の一部と同様に、公開鍵からフィンガープリントが生成されます。
#!/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に感謝
これが便利な場合に備えて: https://ssh-vault.com/post/fingerprint/
例えば:
$ ssh-vault -u bob -f
AWSが使用しているフォーマットに一致するユーザーbobのフィンガープリントを印刷します。
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]))
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();
}
}