SSH 鍵のフィンガープリントを調べる方法
- SSH 鍵 に公開鍵の行を 1 つ以上貼り付けるか、
.pub、authorized_keys、known_hostsファイルをドロップします。 - 鍵ごとにカードが表示され、種類、サイズまたは曲線、コメント、SHA256 と MD5 のフィンガープリント、そして
ssh-keygen -lとまったく同じ行が並びます。 - 出力 欄に何を表示するかを選びます。SHA256 フィンガープリント、MD5 フィンガープリント、PEM 公開鍵(SPKI または PKCS#1)、RFC 4716、正規化した OpenSSH の行から選べます。
- 結果を 出力をコピー するか ダウンロード します。カードの フィンガープリントをコピー は、その値だけをコピーします。
受け付ける入力は普通の .pub の行だけではありません。from="10.0.0.0/8",command="…" のような authorized_keys のオプション、ホスト名付きやハッシュ化された |1|… 形式の known_hosts の行、RFC 4716 の ---- BEGIN SSH2 PUBLIC KEY ---- ブロック、OpenSSH 証明書、PEM 公開鍵、-----BEGIN OPENSSH PRIVATE KEY----- ファイルも読み込めます。
フィンガープリントの計算方法
OpenSSH の公開鍵の行は、種類、Base64 の鍵データ、コメントの 3 つで構成されます。
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG4ZlfvPsoxxd6tpkc1MDAJvZf8exJSDeW7a3xQRKA7d alice@laptop
フィンガープリントは、デコードした鍵データ(Ed25519 では 51 バイト)のハッシュです。
| 形式 | 上の鍵の値 |
|---|---|
| SHA256(OpenSSH 6.8 以降のデフォルト) | SHA256:XSOBs9uz/dFf9ci88yKGbLMcjtzblRna8F0VOmxZiv8 |
| MD5(旧形式) | MD5:93:07:89:27:05:e1:7a:5d:92:6e:ab:13:1e:48:90:d5 |
SHA256 フィンガープリントは末尾の = を取り除いた Base64 で書かれるので、プレフィックスの後は必ず 43 文字です。同じ計算を Python で書くと次のようになります。
import base64, hashlib, sys
line = open(sys.argv[1]).read().split()
blob = base64.b64decode(line[1])
digest = hashlib.sha256(blob).digest()
print("SHA256:" + base64.b64encode(digest).decode().rstrip("="))
= を省略できる理由は パディングの解説 を、さらに詳しくは Python での Base64 を参照してください。
信頼する前にホスト鍵を確認する
初めて接続するとき、OpenSSH は ED25519 key fingerprint is SHA256:…. Are you sure you want to continue connecting? と尋ねます。正しく答えるには、その値を別の経路で入手した値と比べる必要があります。
- サーバーのコンソールで:
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub - プロバイダーが公開しているホスト鍵のフィンガープリントから
- すでにそのホストを
known_hostsに登録している同僚から:そのファイルをここに貼り付ければ、すべてのエントリがフィンガープリント付きで一覧表示されます
ログインせずにサーバーが提示する鍵を確認するには、ssh-keyscan host.example.com | ssh-keygen -lf - を実行すると、すべてのホスト鍵のフィンガープリントが表示されます。
Base64 から鍵の種類を見分ける
鍵データの先頭には、長さ付きの文字列として鍵の種類が入っています。そのため、種類ごとに Base64 の書き出しが決まっています。
| 先頭 | 鍵の種類 |
|---|---|
AAAAC3NzaC1lZDI1NTE5 | ssh-ed25519 |
AAAAB3NzaC1yc2E | ssh-rsa |
AAAAE2VjZHNhLXNoYTItbmlzdHAyNT | ecdsa-sha2-nistp256 |
AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29t | sk-ssh-ed25519@openssh.com(FIDO セキュリティキー) |
AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAx | Ed25519 証明書 |
行に書かれた種類と鍵データの中身が食い違っていると、カードに警告が表示されます。たいていは行を手で編集したことが原因です。
警告と制限
- 2048 ビット未満の RSA は脆弱として警告されます。DSA 鍵も、最近の OpenSSH では無効化されているため警告されます。
- 証明書(
*-cert-v01@openssh.com)では、鍵 ID、シリアル、ユーザー/ホストの種別、プリンシパル、有効期間、重要なオプション、拡張、署名した CA 鍵のフィンガープリントを表示します。 - FIDO 鍵(
sk-…)と Ed448 はデコードできますが、PEM には変換できません。 - 秘密鍵ファイル内に保存されたコメントは表示されません。
- SHA256 はブラウザの WebCrypto API を使うため、https のページが必要です。MD5 はページ自身が計算します。
よくある質問
自分の SSH 鍵のフィンガープリントを調べるには?
.pub ファイルの中身を上に貼り付けるか、ssh-keygen -lf ~/.ssh/id_ed25519.pub を実行します。どちらも 256 SHA256:XSOBs9uz… alice@laptop (ED25519) のような行を出力します。
別のサーバーやサービスでフィンガープリントが違って見えるのはなぜですか?
たいていはハッシュの種類の違いです。古いツールや一部の Web コンソールはコロン区切りの16進数で MD5(MD5:93:07:89:…)を表示し、最近の OpenSSH は Base64 で SHA256 を表示します。古い形式と比べるには、出力 を MD5 フィンガープリントに切り替えてください。
秘密鍵ファイルをここに貼り付けても安全ですか?
このツールが読むのは OPENSSH PRIVATE KEY ファイルの公開鍵部分だけです。この部分はパスワードで保護された鍵でも暗号化されずに保存されています。秘密鍵の部分には触れません。それでも、.pub ファイルを貼り付けるほうがよい習慣です。
SHA256 フィンガープリントは何をハッシュしているのですか?
バイナリの鍵データ(blob)、つまり .pub の行の Base64 部分をデコードしたものです。コメントや先頭の鍵の種類の文字列は含まれないので、鍵の名前を変えてもフィンガープリントは変わりません。