第一次连服务器问的那个 yes:known_hosts 记了什么
授权与合规声明本文全部操作对象均为自建隔离靶场本机容器或隔离虚拟机涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离不含任何攻击步骤、利用载荷与绕过手法请勿将文中环境指向任何非自有系统。一、那句确认到底在比什么1.1 第一次连一台没连过的机器用 SSH 第一次连一台机器会出现一段要你回答的确认大意是对方的身份是这样一串你接受吗。手册把这件事讲得很直接首次连接服务器时会向用户呈上该服务器公钥的指纹KH03。你认下它、回车这串身份就被记在本机再连同一台机器便不再问你同样的问题。很多人把这个动作当成允许我连它。它的对象其实更窄也更重你确认的是这台主机的身份不是这次连接的许可。后文那行长字符串、以及身份变了的提醒都从这个动作长出来。1.2 指纹和密钥不是一回事这是最值得先分清的一处。日常聊天里大家把指纹“密钥”证书混着说一到看那一行就糊涂。公钥是服务器用来证明我是谁的身份材料本身是一长串指纹是把公钥做一次摘要得到的短标识用途是让人能比得过来KH03。手册还提到一条边界若手上只有旧的、基于 MD5 的指纹可以用ssh-keygen的-E选项把指纹算法降下来对齐KH04——这说明指纹的算法可以换而它指向的公钥不变。于是关键结论是你确认时看到的往往是指纹被记住并在日后用来核验的是公钥本身。指纹是用来认的标签公钥才是被核对的身份。把三者摆在一起看服务器公钥是你不直接看到、却被记住并用于日后核验的身份材料指纹是首次连接时摆在你面前、供你比对的那串短标识而你回的那个yes含义是我认下这台主机的身份。# 查看本机 SSH 客户端版本本文 2026-10-09 实测ssh-V1.3 它验的是主机身份不是文件内容这条边界必须说清。主机身份这条线问的是这台机器的公钥我此前认过吗、还对得上吗。而下载完先验一遍那类做法验的是某个文件的内容有没有被改动——对象是一份文件不是一台主机。至于服务端证书由谁签发、信任链怎么走那是另一套信任凭据。三件事都和信任沾边但比对的对象、依赖的材料、含义都不同。本文只把主机身份这一条讲透另两条只在区分时点到为止。本章可以带走的一句第一次连接时你确认的是主机指纹它指向的那把公钥才是被记住、被日后核验的东西这条线讲的是主机身份与文件内容校验证书信任链是三件不同的事。二、它把这些记到了哪里2.1 每个人自己的一本手册对这套机制的定位是一句话SSH 会自动维护并检查一个数据库里面存着它历来用过的主机的身份KH01。落到文件上用户的那一本就放在家目录下主机密钥存放在~/.ssh/known_hostsKH01。它是自动维护的每当用户连到一台未知主机那台主机的密钥就会被加进用户自己的这份文件KH06。也就是说这本账不由你手工登记——是连接这个动作本身在写“为什么不该手打”第四章再讲。2.2 系统级的那一本除了用户自己那一本还有一本系统级的/etc/ssh/ssh_known_hosts会被自动检查KH01。手册把两本的分工说得很清楚它们都存放已知主机的公钥其中全局那本由管理员准备可选每用户那本由程序自动维护KH06。还有一个名字可能与直觉不符手册给的默认是一串而非单个文件——UserKnownHostsFile的默认是~/.ssh/known_hosts,~/.ssh/known_hosts2KH16。两本并列这是本节要照记的一条。2.3 什么时候被写进去写进去的时机两种情形最常见连一台未知主机时被自动加进用户这本KH06以及由脚本或工具批量生成第四章展开。另有一条不那么显眼按默认口径是否落入用户文件还受一个开关影响这个开关放到第五章讲。文件谁维护什么时候用到~/.ssh/known_hosts程序自动维护你连过的每台主机的公钥~/.ssh/known_hosts2同为用户级默认之一与上一本并列为默认值/etc/ssh/ssh_known_hosts管理员准备可选会被自动检查的全局那本本章可以带走的一句主机密钥默认存在用户级~/.ssh/known_hosts默认值还含~/.ssh/known_hosts2系统级/etc/ssh/ssh_known_hosts会被自动检查、由管理员准备且可选用户这本是自动写的不用你手工登记。三、那一行长字符串拆开看3.1 一行由五个字段拼成打开known_hosts看到的是若干行很长的字符串。手册把每行的字段写得很明确每一行包含以下字段——marker可选、hostnames、keytype、base64 编码的密钥、comment字段之间用空格分隔KH07。五个字段里决定这台主机是谁的是hostnames与keytype base64 编码的密钥这两组前者说明这一行说的是哪台或哪些主机后者就是那把被记住的公钥。comment 字段则一直延续到行尾、不被使用手册原文如此更像一句自由备注。字段是否必需它管什么marker可选给这一行加特殊身份标记见 3.3hostnames必需这一行对应的主机名或地址可用模式匹配keytype必需公钥的算法类型base64 编码的密钥必需被记住的那把公钥本体comment可选一直延续到行尾不被使用⚠️代码待验证# 一行 known_hosts 的字段顺序结构示意非真实样例# [marker] hostnames keytype base64-encoded-key comment# 字段之间以空格分隔照手册字段说明记本文不给任何手写样例3.2 hostnames 这一格的花样最多hostnames 不是一个名字而是逗号分隔的一串模式其中*与?按通配符处理每个模式依次与主机名比对KH09。它还带一个反选机制模式前可加!表示否定——若主机名命中了被否定的模式即便同时命中本行别的模式也不被本行接受KH09。此外主机名或地址可用[]括起后接:与非标准端口号KH09——这就是同一台机器不同端口各算各的。还有一种会让人认不出的写法哈希形式。手册说为在文件内容被看到时隐藏主机名与地址主机名可存成哈希形式以|字符开头且一行里只允许一个哈希主机名否定与通配都不能用KH10。哈希所用算法本文未核。3.3 可选前缀、注释行与同名多行回到第一格的 marker它是可选的一旦出现就必须是cert-authority表示这一行是某认证机构的密钥或revoked表示这行的密钥处于吊销状态之一一行只应使用一个 markerKH08。吊销这件事手册另有一句被吊销的密钥不再被接受用于认证或作为认证机构遇到时会产生一条来自 ssh 的警告KH12。还有两条与读文件相关的规则以#开头的行与空行都按注释忽略KH11允许但不推荐为同一个名字留多行或不同主机密钥文件可能出现互相冲突的信息能从任一文件找到有效信息即接受认证KH13。这也解释了一个现象——同一个名字出现好几次不一定是写坏了而是规范允许的容错。本章可以带走的一句known_hosts一行就是可选 marker hostnames keytype base64 密钥 comment五个字段hostnames 支持逗号分隔的通配与!否定、[主机]:端口与以|开头的哈希形式#行与空行是注释同名多行属于规范允许的容错。四、怎么自己核这一行4.1 三个动作查、删、看指纹这本账既然是自动写的核对时就不该靠肉眼。手册给了两个自动编辑入口ssh-keygen -F在known_hosts里搜索指定主机名可带端口列出找到的位置它对查找哈希主机名或地址尤其有用KH17ssh-keygen -R从known_hosts移除属于指定主机名的全部密钥手册点明它适合删除哈希主机KH18。第三件事是看指纹本身手册在讲指纹时就示范过ssh-keygen -l -f的用法KH03——把一个公钥文件的指纹打印出来。三者用一句话记住-F 是查有没有-R 是删掉这一条-l -f 是把这把公钥的指纹算出来看。手册还给了一句实在提醒这些文件里每一行通常长达数百个字符所以你肯定不想手打主机密钥正确姿势是用脚本、ssh-keyscan或拿现成的.pub公钥文件在前头补主机名KH14。它同时说明ssh-keygen能做基础自动编辑删除匹配某主机名的条目、把所有主机名转成哈希形式KH14。动作命令它做什么手册给的适用点查ssh-keygen -F搜索主机名可带端口列出找到的位置尤其适合查哈希主机名/地址删ssh-keygen -R移除属于该主机名的全部密钥适合删除哈希主机看ssh-keygen -l -f打印某公钥文件的指纹讲指纹时的官方示范用法4.2 本机实测这些命令的输出长什么样上面三条不是纸面推论。2026-10-09在一台 macOSssh -V为OpenSSH_10.3p1上用临时目录与一行自造记录做过一次实测KH19ssh-keygen -F hostname -f known_hosts输出首行是一句在文件第几行找到该主机式的注释随后是命中的那一行原文ssh-keygen -F address -l -f known_hosts除首行注释外第二行是该主机的标识 算法名 SHA256 开头的指纹 注释——加了-l它把命中的公钥换算成便于比对的指纹形式ssh-keygen -R hostname -f known_hosts输出说明该文件完成更新并注明原内容被保留为known_hosts.old——被删的那一行会写进这个备份等于给你留了退路。本文只写这些输出的结构首行是什么、第二行由哪几段拼成、会生成哪个备份文件不写任何具体指纹值也不给出可直接照抄的完整文件样例。# 2026-10-09 本机实测macOS / OpenSSH_10.3p1临时目录中执行# 只展示命令与「输出结构」不含任何具体指纹值ssh-keygen-Fhostname-fknown_hosts# - 首行说明在第几行找到该主机随后命中的该行原文ssh-keygen-Faddress-l-fknown_hosts# - 首行同上第二行主机标识 算法名 SHA256 指纹 注释ssh-keygen-Rhostname-fknown_hosts# - 提示文件完成更新原内容保留为 known_hosts.old被删行落在该备份里4.3 肉眼比对的官方补充以及它的局限除了用工具算手册还提供一个不靠工具的官方办法random art随机图案。手册的解释是光看指纹字符串很难比对所以还支持用 random art 目视比对主机密钥把VisualHostKey设为yes后每次登录都会显示一小段 ASCII 图案无论会话是否交互KH05。用法是认得某台已知主机常出现的图案一旦出现完全不同的图案就能较快发现主机密钥变了KH05。但手册紧接着给这条办法划了边界而且很谨慎这些图案并非无歧义一张看起来相似的图案只能说明主机密钥相同的概率较高并不能作为保证性的证据KH05。换句话说random art 是辅助你起疑的不是替你下结论的。本章可以带走的一句核这一行有三件事——ssh-keygen -F查、-R删、-l -f看指纹三者都以自动编辑为前提、手册也明说不要手打random art 能做肉眼比对但手册自己讲清它只能给出概率、给不了确凿结论。五、什么时候真的该停下来5.1 身份变了会怎样前面讲的都是认下来、记下来。真正该警觉的是另一种情形本来认过的主机它的身份变了。手册对此的说法是若某台主机的身份发生变化SSH 会就此发出警告并禁用口令认证目的是防止服务器冒充与中间人攻击KH02。两点要拆开看。第一它做的是警告 关掉一种认证方式不是静默换凭据继续连。第二手册给出的理由是防止……否则会被用来绕过加密KH02——身份对不上时加密本身并不足以保护你因为你可能正和另一台机器在加密通信。这也是变了值得停下来看的原因。5.2 四个取值和一个容易记错的默认控制这套行为的是StrictHostKeyChecking。手册给了四个取值逐条照它的口径KH15yes从不自动把主机密钥加入~/.ssh/known_hosts并拒绝连接主机密钥发生变化的主机accept-new会自动把新主机密钥加入用户的 known_hosts但不允许连接主机密钥发生变化的主机no/off会自动加入新主机密钥并允许连接主机密钥发生变化的主机继续受某些限制ask默认只有在用户确认确实想要这样之后新的主机密钥才会被加入用户的 known_hosts同时会拒绝连接主机密钥发生变化的主机。请特别注意最后那个默认值默认是ask不是别的。这一步也顺带回答了第二章末尾留下的问题——默认情况下新主机密钥并非无条件写入而是要等你确认。手册还给了这四档一个共同的收尾句值得原样记住“已知主机的主机密钥在所有情况下都会被自动核验”KH15。无论把那一档调成什么已知主机这一类的核验都照做——这句是本节最不该记岔的一处。取值新主机密钥是否自动加入主机密钥发生变化的主机yes从不拒绝连接accept-new自动加入拒绝连接no/off自动加入允许继续受某些限制ask默认用户确认后才加入拒绝连接⚠️代码待验证# StrictHostKeyChecking 四档照手册口径记本文不给任何绕过/关闭的做法# yes - 从不自动加入拒绝连接密钥发生变化的主机# accept-new - 自动加入新密钥仍拒绝连接密钥发生变化的主机# no / off - 自动加入允许连接密钥发生变化的主机继续受某些限制# ask默认 - 用户确认后才加入拒绝连接密钥发生变化的主机# 手册收尾句已知主机的主机密钥在所有情况下都会被自动核验。5.3 本文不给怎么让它别再问的做法读到默认是ask很容易顺手想改掉它好让那段确认不再出现。本文不做这件事也不推荐任何非默认取值如何关闭或跳过主机密钥校验属于本文明确不写的范围这正是它作为安全机制存在的意义改档位也不解决该不该认下这台主机这个真问题。真正该带走的是一条判断顺序遇到身份变了的提醒先当作需要查证的事而不是需要关掉的弹窗。怎么查第七章收成一张流程。本章可以带走的一句主机身份一旦变化SSH 会警告并禁用口令认证用意是防冒充与中间人StrictHostKeyChecking四档里默认是ask且手册明确——已知主机的主机密钥在所有情况下都会被自动核验本文不给任何关闭或跳过的做法。完整版主机密钥对照表这一章的四档取值与默认值、手册那句收尾话、身份变化的含义连同第二章的两个文件位置、第三章的字段拆解一起收进资料包扫码即可获取六、三类常见误解的对照表前几章把是什么讲完了这一章用它回答几个最常见的说法只借前五章事实不作引申。6.1 “删掉 known_hosts电脑就更安全或者更不安全”手册给的定位是这本账存放的是已知主机的公钥是自动维护并检查的身份库KH01、KH06。删掉它改变的是本机还记不记得这些身份而不是这台机器本身的加密强度后果是下次连接这些主机会回到未知主机状态KH06。6.2 “看到了指纹说明这次连接加密更强”由 1.2 可知指纹是对公钥做的摘要用途是便于比对不是加密强度的一部分KH03、KH04。它出现与否说明的是要不要做身份确认而非通道有多强把指纹当成加密等级是把两件事混成一件。6.3 “主机换个名字就能连上、也不再提醒了”known_hosts记的是主机的身份公钥hostnames 那格只是这一行对应哪些名字支持逗号分隔、通配与!否定、[主机]:端口等形式KH07、KH09。名字与认下的身份有对应关系而主机身份本身变化时处理逻辑是警告并禁用口令认证KH02。至于同名多行手册明确允许但不推荐且能从任一文件找到有效信息即接受认证KH13——它是容错不是改名即可绕过。常见说法用哪条事实回答结论删掉known_hosts就更安全/更不安全KH01、KH06它是自动维护的已知主机身份库改变的是记不记得不是加密强度出现指纹 加密更强KH03、KH04指纹是公钥摘要便于比对管的是要不要确认身份不是通道强度改主机名就能连上、不再提醒KH07、KH09、KH02、KH13名字与身份有对应身份变化照样警告同名多行只是容错本章可以带走的一句known_hosts是身份记忆而非安全开关指纹管的是要不要确认身份而非通道有多强改名既不改变认下的身份、也不改变身份变化就警告这条规则——三条误解其实都源于把主机身份和别的东西混在了一起。七、一张自查流程7.1 三个问题把前六章收成一条能用的流程只需在遇到相关提示时问自己三个问题第一这是第一次见还是以前见过、这次变了前者是首次呈现指纹KH03属正常确认后者涉及身份变化手册的处理是警告并禁用口令认证KH02——两类要分开。第二我手里有没有可比对的材料有工具时用ssh-keygen -F查、-l -f看指纹KH17、KH03想肉眼比对手册提供 random art但它只给概率、不给保证KH05。没有材料时该做的是去拿到材料而不是靠模糊印象点接受。第三我改的那个档位是在解决问题还是关掉提醒手册明确已知主机的主机密钥在所有情况下都会被自动核验KH15改档位不改变该不该认下这台主机这个判断。关闭或跳过校验的做法本文一律不写。7.2 一张表收束情形该做什么依据第一次连一台机器把它当首次确认身份处理KH03以前连过、这次提示身份不符停下来查证不要当作日常弹窗KH02想确认本机记没记这台主机用ssh-keygen -F查哈希也适用KH17想比对指纹ssh-keygen -l -f看指纹random art 仅作辅助KH03、KH05冒出改个档位就不提醒了的念头记住默认是ask、已知主机一律自动核验本文不给关闭/跳过做法KH15⚠️代码待验证# 自查流程只读动作本文不给任何关闭/跳过校验的做法# 1) 分辨首次确认 还是 身份变化# 2) 查本机记录ssh-keygen -F hostname -f known_hosts# 3) 比对指纹ssh-keygen -l -f pubkeyrandom art 仅作辅助# 4) 记住默认档位是 ask已知主机的主机密钥在所有情况下都会被自动核验7.3 回到最初那一行回到标题那个问题第一次连服务器时你回的那个 yesknown_hosts到底记了什么到这里可以有据地回答——它记的是那台主机的身份公钥以可选 marker hostnames keytype base64 密钥 comment的字段形式落在本机账本里KH07首次连接时你比对的往往是指纹KH03一旦这台主机的身份变化处理逻辑是警告并禁用口令认证KH02而无论记在哪儿、档位怎么设已知主机的主机密钥在所有情况下都会被自动核验KH15。至于怎么少问一次本文不写——它从来不是这篇要解决的问题。本章可以带走的一句遇到相关提示先分首次确认还是身份变化再用ssh-keygen -F/-l -f去查与比对认下身份靠的是可比对的材料而不是模糊印象改档位不等于解决问题因为已知主机的主机密钥在所有情况下都会被自动核验。完整版主机密钥对照表这一章的自查流程表 四步只读动作加上第六章的三条误解对照汇总进资料包扫码即可获取附表 A本文引用事实与官方出处对照表KH 编号事实陈述一手出处本文位置KH01SSH 自动维护并检查一个记录历来所用主机身份的数据库主机密钥存于~/.ssh/known_hosts/etc/ssh/ssh_known_hosts会被自动检查新主机会被自动加入用户文件S2ssh(1)手册第 1、2 章KH02若某主机身份发生变化ssh 会警告并禁用口令认证以防服务器冒充与中间人攻击避免被用来绕过加密S2ssh(1)手册第 5、6 章KH03首次连接服务器时会向用户呈上其公钥指纹除非该选项被禁用指纹可用ssh-keygen -l -f求得S2ssh(1)手册第 1、4 章KH04指纹已知即可比对接受或拒绝若只有旧式 MD5 指纹可用ssh-keygen -E降低指纹算法以对齐S2ssh(1)手册第 1、6 章KH05直接比对指纹字符串有难度故支持用 random art 目视比对设VisualHostKeyyes后每次登录显示 ASCII 图案图案非无歧义相似只给概率、非保证S2ssh(1)手册第 4、7 章KH06两份文件保存全部已知主机公钥全局文件由管理员准备可选每用户文件自动维护连到未知主机时其密钥被加入用户文件S2sshd(5)手册第 2、3 章KH07每行字段marker可选、hostnames、keytype、base64 编码密钥、comment以空格分隔comment 延续至行尾且不被使用S2sshd(5)手册第 3、6 章KH08marker 可选出现时只能是cert-authority或revoked一行只应使用一个S2sshd(5)手册第 3 章KH09hostnames 为逗号分隔模式*?为通配可前置!表示否定主机名/地址可用[ ]括起后接:与非标准端口号S2sshd(5)手册第 3、6 章KH10主机名可存为哈希形式以隐藏名称与地址以|开头一行只允许一个哈希主机名且不能使用否定/通配S2sshd(5)手册第 3 章KH11以#开头的行与空行按注释忽略S2sshd(5)手册第 3 章KH12可用revoked标记被吊销密钥此类密钥不再被接受用于认证或作为认证机构遇到时产生警告S2sshd(5)手册第 3 章KH13允许但不推荐为同一名字留多行或不同主机密钥文件可能冲突能从任一文件找到有效信息即接受认证S2sshd(5)手册第 3、6 章KH14这些行通常长达数百字符不应手打应由脚本、ssh-keyscan或取现成.pub在前补主机名生成ssh-keygen提供基础自动编辑删除匹配主机名、转为哈希形式S2sshd(5)手册第 4 章KH15StrictHostKeyChecking四档——yes从不自动加入、拒绝连接密钥发生变化的主机、accept-new自动加入新密钥、仍拒绝连接密钥发生变化的主机、no/off自动加入、允许密钥发生变化的主机继续受某些限制、ask默认用户确认后加入、拒绝连接密钥发生变化的主机收尾句已知主机的主机密钥在所有情况下都会被自动核验S2ssh_config(5)手册第 5、7 章KH16UserKnownHostsFile指定一个或多个用户主机密钥数据库文件以空白分隔none表示忽略任何用户级 known_hosts默认是~/.ssh/known_hosts,~/.ssh/known_hosts2S2ssh_config(5)手册第 2 章KH17ssh-keygen -F在 known_hosts 中搜索指定主机名可带端口列出找到的出现位置适合查找哈希主机名或地址S2ssh-keygen(1)手册第 4、7 章KH18ssh-keygen -R从 known_hosts 移除属于指定主机名的全部密钥适合删除哈希主机S2ssh-keygen(1)手册第 4 章KH19本机实测2026-10-09macOSOpenSSH_10.3p1-F首行为第几行找到式注释 命中行原文-F ... -l第二行为标识 算法名 SHA256 指纹 注释-R提示文件完成更新、原内容保留为known_hosts.old本文实测第 4 章KH20本机实测环境ssh -V→OpenSSH_10.3p1, LibreSSL 3.3.6截至 2026-10-09本文实测第 1 章附表 B术语速查表术语一句话解释known_hosts本机记录已知主机身份公钥的账本默认在~/.ssh/known_hosts主机密钥 / 主机公钥服务器用来证明自身身份的身份材料指纹对公钥做摘要得到的短标识便于人眼比对random art用 ASCII 图案辅助目视比对主机密钥手册说它只给概率marker行首可选标记cert-authority或revokedhostnames该行对应的主机名/地址逗号分隔支持通配、!否定、[主机]:端口、哈希形式StrictHostKeyChecking控制新主机密钥是否自动加入、以及是否连接密钥发生变化的主机默认askssh-keygen -F/-R/-l -f查 / 删 / 看指纹三个动作known_hosts.old-R删除时保留原内容的备份文件代码待验证本文标记该命令未在本机实际运行过写在最后这篇用到的资料写这篇文章时我一直在想那个反差——第一次连服务器时随手回的一个 yes背后其实是本机在和一台机器对身份拆开才看清指纹只是标签被记住的是公钥。顺手也整理了几份配套的东西靶场环境对照表DVWA、upload-labs 在 Windows / macOS / Linux 三平台的可行性与推荐路径Web 安全学习路线图从基础打牢到安全管理四个阶段各学什么常用靶场清单每个靶场练什么、适合哪个阶段资料是我自己整理的放在下面这个码上扫码即可获取添加时备注「靶场」优先通过。拿到之后建议先看环境对照表那一份把本文讲的known_hosts 记了什么、怎么用 ssh-keygen 去查对照着过一遍下次再看到那段确认就知道自己答应的是什么。