如何获取 SSH 密钥指纹
- 把一行或多行公钥粘贴到 SSH 密钥,或拖入
.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 密钥数据块和注释。
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、序列号、用户或主机类型、主体(principals)、有效期、关键选项、扩展,以及签名 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) 的一行。
为什么在另一台服务器或服务上看到的指纹不一样?
通常是哈希算法不同:旧工具和一些网页控制台以冒号分隔的 hex 显示 MD5(MD5:93:07:89:…),新版 OpenSSH 以 Base64 显示 SHA256。把 输出 切换为 MD5 指纹,就能和旧格式对比。
把私钥文件粘贴到这里安全吗?
工具只读取 OPENSSH PRIVATE KEY 文件中的公钥部分,即使密钥有密码保护,这部分也是未加密存储的;私钥部分不会被触及。不过,养成粘贴 .pub 文件的习惯仍然更好。
SHA256 指纹到底是对什么计算哈希?
对二进制的密钥数据块,也就是 .pub 行中 Base64 部分解码后的结果。注释和前面的密钥类型文本不包括在内,所以给密钥改名不会改变它的指纹。