如何理解ssh的known_hosts/authorized_keys文件,里边的数据结构是什么?
目标:
- ssh时不用输入密码
- 采用相同998899端口时,不会出现服务器共匙变化的warining提示:
如果远程服务器的公钥发生了更改,你的系统会根据 known_hosts 文件中存储的信息记录此次更改,你也会收到此更改的通知:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: POSSIBLE DNS SPOOFING DETECTED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for xyz remote host has changed,and the key for the corresponding IP address xxx.yy.xxx.yy is unknown. This could either mean that DNS SPOOFING is happening or the IP address for the host and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
69:4e:bb:70:6a:64:e3:78:07:6f:b4:00:41:07:d8:9c.
Please contact your system administrator.
Add correct host key in /home/.ssh/known_hosts to get rid of this message.
Offending key in /home/.ssh/known_hosts:1
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
known_hosts
文件是 SSH(Secure Shell)协议中的一个重要安全特性,用于存储远程主机的公钥信息。当你首次通过 SSH 连接到某个远程服务器时,SSH 客户端会请求该服务器的公钥,并将其与服务器提供的公钥进行比较。如果公钥是新的(即之前未连接过该服务器或公钥已更改),SSH 客户端会询问你是否信任该公钥,并允许你将其添加到 known_hosts
文件中。
理解 known_hosts
文件
- 目的:防止中间人攻击(MITM),确保你连接到的远程服务器是你所期望的服务器。
- 位置:通常位于用户的家目录下(如
~/.ssh/known_hosts
),但也可能位于系统级别的 SSH 配置目录中(如/etc/ssh/ssh_known_hosts
,但这取决于系统和 SSH 的配置)。 - 内容:包含了一系列远程主机的公钥和对应的标识信息,如主机名、IP 地址和端口号(尽管端口号不是必须的,因为 SSH 默认使用 22 端口)。
数据结构
known_hosts
文件中的每一行都代表了一个远程主机的公钥信息,其格式大致如下:
[hash算法] 主机名或IP地址 [端口号] 公钥
- hash算法(可选):SSH 7.6 版本之后,为了增强安全性,引入了主机名的哈希值作为前缀,以防止某些类型的 DNS 欺骗攻击。这个哈希值是基于主机名(不包括端口号)计算得出的。
- 主机名或IP地址:远程主机的标识,可以是域名或 IP 地址。
- 端口号(可选):远程主机上 SSH 服务的端口号,默认为 22。如果指定了端口号,它会被方括号包围并紧跟在主机名或 IP 地址之后。
- 公钥:远程主机的公钥,用于验证远程服务器的身份。
示例
|1|abcdef1234567890abcdef1234567890abcdef12|example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...
192.168.1.1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...
[localhost]:2222 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...
- 第一行是一个带有哈希前缀的条目,表示
example.com
的公钥。 - 第二行是 IP 地址
192.168.1.1
的公钥,没有指定端口号,因此使用默认端口 22。 - 第三行是
localhost
在非标准端口 2222 上的公钥。
注意事项
- 如果远程服务器的公钥发生变化(例如,服务器重装或密钥被更换),SSH 客户端在下次连接时会警告你公钥不匹配,并阻止连接,除非你手动删除或更新
known_hosts
文件中的相应条目。 - 管理员应定期检查和更新
known_hosts
文件,以确保其包含正确的公钥信息,并删除不再需要的条目。
每次开发代码的时,最简单的方法就是删除known_hosts。重新生成远程服务器的 共匙。
ssh免密登录原理 服务器A要免密登录服务器B,则要把服务器A的公钥存到服务器B的授权公钥文件中;先在服务器A上生成一对秘钥(ssh-keygen),然后将公钥拷贝到服务器B的authorized_keys文件中。
原理:
服务器A向服务器B发送一个连接请求,信息包括服务器A此时登录的用户名、服务器A的ip以及要免密登录的服务器B的用户名; 服务器B收到请求,会从服务器A要免密登录服务器B的用户名家目录下 authorized_keys 中查找是否有相同的服务器A用户名、服务器Aip; 如果有,服务器B会随机生成一个字符串,然后使用服务器A的公钥进行加密,再发送给服务器A; 服务器A接到服务器B发来的信息后,会使用私钥进行解密,然后将解密后的字符串发送给服务器B; 服务器B接到服务器A发来的信息后,会和之前生成的字符串进行比对,如果一致,则允许免密登录。 ————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/can_chen/article/details/128178370
解决方案:
1、 传输本地的共匙到 服务器的 authorized_keys:
2、
这里边存放的都是对应linux服务器的共钥,都可以放在known_hosts,然后修改成只读模式,这样只用在Termius中打开端口转发,直接就可以vscode编写代码了,而且不用输入密码,不用删除known_hosts文件:
91.59:
[localhost]:99 ssh-ed25519 AAAAC3NzafecNgqaVteJ57gs2+pm8+8ktE
[localhost]:9 ecdsa-sha2-nistp256 wMxiCSufNSfnN3HjRKJyUwt7E=
13.4
[localhost]:89 ssh-ed25519 AAAAC3wDfwPC94o1p
[localhost]:99 ecdsa-sha2-nistp256 AAAAE2VjZHNhLfwnUAxc03xcgxrsD9G4yNpDU=