SSH RSA Known_hosts 的那些事

1,010 阅读7分钟

经常需要接触Linux,就无可避免需要进行通信,不管是可视化客户端软件,还是直接使用命令行SSH命令,其背后通信原理大多都是走的SSH协议,关于 SSH 相关知识,可参考最下面连接,这里做一些常用总结。

声明

针对下面需要用到的一些值,做一些示例声明:

  • 服务器操作系统:CentOS 7
  • IP:192.168.1.100
  • User:root
  • Password:123456789

实际操作,请把上面信息替换成自己的。

SSH 普通登录

使用命令行登录时,通常是ssh root@192.168.1.100 ,这时会提示以下内容:

The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:Cuogx2RbYbaYdCNhloFVudgjfCVsEZUhOnTFwhJ+Dh8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

注意:上面的提示,只有在你 第一次 像该服务器连接时才会提示,并且,如果这里你输入 no ,那么下次依然会提示,如果这次输入 yes ,那么以后将不会再提示。(哪怕你接下来密码输入错误没有登录成功)

输入 no 会退出;

输入 yes 会进入到输入密码提示,如下:

......
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.100' (ED25519) to the list of known hosts.
root@192.168.1.100's password:

这个时候会提示让你输入密码,暂且先不说密码,先看看第二句:

  • 原文:Warning: Permanently added '192.168.1.100' (ED25519) to the list of known hosts.
  • 百度翻译一下:警告:已将“192.168.1.100”(ED25519)永久添加到已知主机列表中。

前面提到,如果输入yes,以后便不会再提示,就是这句话起的作用,这句话背后做了什么呢? 再执行:cat ~/.ssh/known_hosts | grep '192.168.1.100',输出如下:

192.168.1.100 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKrl7c+eaBxma6Bx9O+p6KmdBwHak8cedikgu1NRuKpU

好了,这里又牵扯出一个文件~/.ssh/known_hosts,简单讲,这个文件的作用就是,本机每次向一个新的服务器发出连接请求时,经过你自己确认(输入yes)后,就会在这个文件中保留一个服务器指纹,用来记住你跟这个服务器的通信。

加入服务器重装了系统,或者重装了 SSH 服务,这个时候你再次 ssh root@192.168.1.100,便会提示:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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
77:a5:69:81:9b:eb:40:76:7b:13:04:a9:6c:f4:9c:5d.
Please contact your system administrator.
.......
......

这个时候,解决这个问题的方式有三种:

  1. 删除 ~/.ssh/known_hosts 文件,网上很多帖子都是这么说的,也是最粗暴最不提倡的;
  2. 手工打开 ~/.ssh/known_hosts 文件,找到跟你要连接的IP,例如本文中 192.168.1.100 相关的行,删除掉;
  3. 执行 ssh-keygen -R 192.168.1.100,该命令会自动帮你干第二条中的事,多好多棒多省事~

然后再次 ssh root@192.168.1.100 时,便又回到了本文最初的地方。

SSH 免密码登录

在客户端与服务器端登录时,也可以不用密码哦,就像浏览器记住密码一样,但和浏览器不一样的是,浏览器是记住了密码,在浏览器中还可以找到密码,更合适的比喻,应该更像是一些OpenAPI中提供的Token令牌等机制,不用使用账号密码而是通过Token便可以获取数据,可以更有效的管理授权凭证。

SSH 免密码的前提是需要一对秘钥对,常见操作,如我们经常使用的GitHub服务,常用操作两种方式:HTTP协议SSH协议,也就是经常在git仓库克隆时看到的URL前面有个选项:HTTP or SSH,使用 HTTP 时地址为 https://github.com/xxxx/yyy.git ,使用 SSH 时地址为 git@github.com:xxxx/yyy.git

然后如果使用 SSH,那么你还需要这么执行以下操作步骤:

  1. 本机执行 ssh-keygen -t rsa -C '邮箱',一路回车,完了在 ~/.ssh/目录中会生成两个文件:it_rsa(私钥文件) 和 id_rsa.pub(公钥文件)
  2. id_rsa.pub中的内容,复制出来,到 GitHub 中,个人设置,SSH Key管理,新增 Key ,然后黏贴进去,保存提交。
  3. 最后你就可以愉快的使用 git -h 的各种命令把你的代码再仓库中操作来操作去。

如果不这么操作,那么只能通过 http协议操作,需要输入GitHub的账号密码,不再多说。

铺垫这么多,言归正传~

其实当你 ssh root@192.168.1.100 时,SSH 默认就会将 id_rsa 私钥,传输给服务器,然后到服务器的~/.ssh/authorized_keys文件中去找对应的公钥 id_rsa.pub 的内容,如果找不到,则会提示让你输入密码,如果找到,就直接登录了。

所以免密码只需要三步即可完成:

  1. 本机执行 ssh-keygen -t rsa -C '自己起个名字'
  2. 复制 ~/.ssh/id_rsa.pub 的内容
  3. 登录服务器,编辑 ~/.ssh/authorized_keys (如果是第一次,这个文件不存在,则需要新建)文件,把复制的内容黏贴进去,注意一行一个,最后不要有空行,有时候登录不成功,就可能是格式问题。

以上三步结束,在 ssh root@192.168.1.100,你就发现终于可以 一步登天了,恭喜成功。

SSH 配置管理

如果你只有一对秘钥,用在所有的GIT平台,和所有的 服务器中,那么当你私钥泄露时,你是不是要去所有的平台去把添加的公钥都给干掉,那不是很麻烦吗?当然如果是个人,也没多少,无所谓啦~

下面有一种更加方便管理的方式,使用~/.ssh/config配置文件管理,大概内容如下:

# 这是  192.168.1.100 相关的信息的注释
Host centos-100
HostName 192.168.1.100
User root
Port 22
IdentityFile ~/.ssh/id_rsa

上面只是一个服务器的配置,你可以配置很多,而且,参数也不仅仅这些,可以参考下方连接,上面的参数做下简要说明:

  • Host:连接别名
  • HostName:IP
  • User:用户
  • Port:端口
  • IdentityFile:私钥文件位置

例如示例中的配置,完了之后,就可以直接这样用 ssh centos-100 就可以,并且当你输入前面几个字母时,命令行终端还会帮你自动提示,就很强,并且,如果你如果做了免密码,这里依然是OK的。

上面说了可以配置多个,其实不单单是配置多个服务器哦,这里最佳体现,是可以使用多个秘钥对,就是给一个服务器申请一个秘钥对,一对秘钥对,只用来免密一台服务器,方便维护管理。

生成多对秘钥

前面执行 ssh-keygen -t rsa -c 'xxx',默认生成的文件名是 id_rsaid_rsa.pub,其实是可以指定名称的:

ssh-keygen -t rsa -f ~/.ssh/centos-106

其中-f ~/.ssh/centos-106 就是指定文件名,注意这里用到了路径,如果不使用路径,默认生成到当前执行命令所在的目录。

使用这种方式生成多对秘钥,在通过 ~/.ssh/config 文件,进行配置,即维护了多台服务器之间独立秘钥,又方便快捷管理。

注意事项

通过上面这种方式,其实可以发现,以后换了电脑或者电脑要重装系统时,把本地~/.ssh目录备份一下,我个人就是在每次新增秘钥对时,都会打包备份一次。

注意哦:~/.ssh 目录中的文件,对权限有要求哦,查看一下:ls -l ~/.ssh

......
-rw-------  1  xxxxxx staff   1.8K  3 17  2020 id_rsa
-rw-r--r--  1 xxxxxx  staff   400B  3 17  2020 id_rsa.pub
......

公钥文件(id_rsa.pub):644,私钥文件(id_rsa):600

也就是说,当公钥添加到服务器之后,我们只要有私钥文件,和目标服务器IP和用户名,并且权限是 600,就可以直接登录,前几天刚帮朋友调试个问题,问他要了私钥文件,操作成功~

参考

wangdoc.com/ssh/

PS:关于 RSA 更多信息,可以自行去搜索,在一些对安全性高的应用中,都会用到RSA加密,我之前在公司做的一个项目,涉及到了数据库敏感信息等,就是使用RSA非对称加密~