Summary
- RFC 4251 描述了把主机名与公钥的对应关系留在客户端本地:初次见面记一笔,以后每次都拿来比对。
- OpenSSH 把这份记忆写进
known_hosts;新密钥可以提示确认,已知主机的密钥一旦改变则会触发拒绝与警告。可信服务器还能在旧钥匙仍有效时预告新钥匙。
SSH 连接首先要认的不是用户名,而是服务器。服务器在密钥交换时拿出主机密钥;客户端需要知道这把钥匙是否属于自己想去的那台机器。2006 年 1 月发布的 RFC 4251 摆出两条路:由客户端自己保存主机名与公钥的对应关系,或由受信任的证书机构作证明。前一条路不用建设中央名册,代价是每位访客得管好自己的通讯录。
标准给出了最朴素的办法:第一次连接时接受一把钥匙,把它存起来;此后再去同一个主机,就拿新出示的钥匙与旧记录比。电脑于是有了记性。第一次仍是关键:如果有人截住了初次握手,他可以先递出自己的钥匙。因此,独立渠道核对指纹有实际作用。此后若有人换一把钥匙来敲同一扇门,差异就会被看见。
OpenSSH 的通讯录叫 ~/.ssh/known_hosts。OpenBSD 的 ssh(1) 手册说明,客户端保存已知主机的密钥,旧主机突然换钥匙时会发出醒目的警告。警告说的其实很简单:今天来的人,与上次登记的人对不上。服务器可能重装过,也可能按计划换过钥匙;也可能有人冒充它。单凭这个差异,机器不会编出侦探小说的结局。它负责按响门铃。
OpenBSD 的 ssh_config(5) 手册把第一次见面的规矩写成选项:StrictHostKeyChecking=ask 对陌生钥匙先问人,对已知主机的变更拒绝连接;accept-new 自动记住陌生钥匙,仍拒绝变更;yes 则要求预先人工加入钥匙。选项改变初次见面的速度,没有取消老相识之间的比对。
换钥匙也不必等到报警那一刻。手册介绍的 UpdateHostKeys 可以让已经通过认证的服务器宣布其他主机密钥。旧钥匙还在、身份已经核实的时候,新钥匙先进入通讯录;之后再退掉旧钥匙。这是熟人领新人进门,而不是让新人自己报上一个熟人的名字。
ssh-keyscan 能批量抓取公钥,输出也适合放进 known_hosts。但它的手册明确说,扫描本身证明不了密钥主人是谁;路上的拦截者同样会交出一把公钥。聪明的地方从来不是抄得快,而是抄对第一次,并让此后的每次来访都接受那份记录的质询。
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance





