SSHキーフィンガープリントとは何ですか?どのように生成されますか?


129

ssh新しいマシンを起動すると、常に次のメッセージが表示されます。

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53

それは何の略ですか?すべてのマシンに毎回同じ指紋がありますか?

これらの指紋はどのように生成されますか?どのパラメーターに依存していますか?

回答:


65

フィンガープリントはホストの公開鍵に基づいており、通常は「/etc/ssh/ssh_host_rsa_key.pub」に基づいています。一般的には、接続先のホストを簡単に識別/検証するために使用されます。

指紋が変更された場合、接続先のマシンの公開鍵が変更されています。これは悪いことではないかもしれませんが(sshの再インストールから生じる可能性があります)、同じドメイン/ IPの別のマシンに接続していること(ロードバランサーなどを介して接続している場合に発生すること)または攻撃者が何らかの方法でssh接続をインターセプト/再ルーティングして、ユーザー/ pwを索する可能性のある別のホストに接続する中間者攻撃の標的にされています。

結論:指紋の変更について警告を受けた場合は、安全な接続を介して正しいホストに実際に接続していることを慎重に確認してください。ほとんどの場合これは無害ですが、潜在的な問題を示している可能性があります

参照:http
: //www.lysium.de/blog/index.php ?/archives/186-How-to-get-ssh-server-fingerprint-information.htmlおよびhttp://en.wikipedia.org/ wiki / Public_key_fingerprint


5
「...安全な接続を介して正しいホストに実際に接続していることを慎重に確認し、再確認してください」-愚かな質問ですが、どうすれば簡単にこれを行うことができますか?
サバラ

1
@Savara以前に接続しなかったSSHサーバーに接続する場合は、サーバー管理者にSSHサーバーの公開鍵を要求する必要があります。サーバー管理者がテキストを提供します。このテキストをファイルに追加する必要があります~/.ssh/known_hosts。このように、サーバーに接続すると、公開キーをに保存しているため、SSHクライアントはこのサーバーを認識しますknown_hosts。したがって、SSHクライアントが「ホストの信頼性を確立できません」と言った場合、実際には「はい」と言ってはいけません。事前にサーバーの公開鍵を常に追加する必要があります。
-Utku

@Savaraこれを行うと、SSHクライアントから「クライアントの信頼性を確立できません」または「サーバーの公開キーが変更されました」と表示されたときに、何か怪しいことが起こっていることがわかります。したがって、あなたは常にあなたに、サーバの公開鍵を追加する必要があり~/.ssh/known_hosts、あらかじめファイルと決して言わないあなたのSSHクライアントはあなたを伝えるときyes「とクライアントの信頼を確立することができない」か、それはあなたを伝えると、「サーバの公開鍵はされていますかわった"。
Utku

3
ええ、私はSSHフィンガープリントを表示するメカニズムがどのように機能するかを完全に知っていますが、多くの場合、別のチャネルを介してフィンガープリントを取得するオプションがありません。残念ながら、豆腐は私たちがよく手に入れる最高のものです。
サバラ

「はい」と答えた後でも真正性を確認する方法はありますか?
交換

104

次のssh-keygenように使用して、公開鍵のフィンガープリントを生成できます。

ssh-keygen -lf /path/to/key.pub

具体例(RSA公開鍵を使用する場合):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)

最初の部分(2048)はビット単位の鍵の長さ、2番目の部分(00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)は公開鍵のフィンガープリント、3番目の部分は公開鍵ファイル自体の場所です。


この公開鍵からこの形式を12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53に変換する方法を知っていますか?
キットホー

@KitHo私はあなたの質問を理解しているかどうかわかりません。ssh-keygen -lfあなたが望むことをするだろうと思うので、例を更新しました。
ベンジャミンオークス

5
新しいマシンにSSHは-INGの場合には、どのような1が見ることはありません、ユーザーのpubkeyで指紋が、ホストのpubkeyで指紋。したがって、質問のコンテキストのより良い例はssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pubです。localhostへのSSHログインにも表示されるフィンガープリントを示します。
タニウス14

58
私のssh-keygen報告sha256指紋。md5指紋を取得するために走りましたssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub。#archlinux
ジャスティン・C

6
(@JustinC)OpenSSHバージョン6.8(2015年3月)以降は、デフォルトで16進数ではなくbase64で表示されるSHA256に変更されました。クライアントの使用、ssh -o FingerprintHash=md5またはlike ssh_configを使用するものと同等のもの。sshscp
-dave_thompson_085

72

フィンガープリントは、Base64でエンコードされた公開キー内のバイナリデータに対するMD5です。

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19

md5sum 6530389635564f6464e8e3a47d593e19は、キーが生成されたときに表示される指紋で、コロンを区切らないでのみ表示されます。


ただし、AmazonがEC2 Key Pairsコンソールに表示する指紋を処理している場合残念ながらそれは別の獣かもしれません。32桁の16進文字列の場合、上記の標準MD5 SSH公開キーフィンガープリントです。しかし、それが40桁の16進数の場合、実際にはPKCS#8形式の秘密キーの SHA1を取得して計算されたフィンガープリントです。

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58

1
この回答は、次のシナリオで役立ちました。システムはSHA1を使用して指紋を計算しますが、友人はmd5を使用します。私はSHA1である指紋を共有しましたが、それは彼女のシステムが生成したMD5と一致しませんでした。これは役に立ちました-ありがとう!sed 's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==。* $ | == |' | base64 -d | md5sum
リジルゼパ

これは、SHA-1またはSHA-256ダイジェストを使用するため、この指紋がDNS SSHFPレコードの指紋と一致しない理由を理解する上で非常に重要です。
neirbowj

1
@Liczyrzepa publickeyフィールドは、キーのタイプとビットサイズに応じて、末尾に「==」がある場合とない場合があります。より安全で、IMOの使用が簡単awk '{print $2}' /path/to/keyfile.pubまたは類似しています。
dave_thompson_085

13
これは、指紋の計算方法を説明する唯一の答えです
グルーズ

2
ただし、Linux Mintのコマンドは次のcat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
とおりです。– greuze

13

SSHキーファイルをチェックして、githubによって「キーのデプロイ」として報告されているものと同じかどうかを確認する場合は、これが最適です...

プライベートURLから:https://github.com/<username>/<repo_name>/settings/keys表示されます githubのスクリーンショット

ターミナルで:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)

秘密鍵と公開鍵の両方で同じフィンガープリントを取得することに気付くでしょう。

同じコマンドをGitHubの便利な機能と組み合わせることができます。これは、https://github.com/ <username> .keysでユーザーのSSH公開キーを公開するという事実です。

これを利用するために使用できるワンライナーを次に示します。

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B

1
ssh-keygen -r host.name.com

sshdインスタンスで設定されたすべての公開キーのフィンガープリントを出力します。

これらは、DNS SSHFPレコードに配置できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.