最近搭建集群过程中,阅读了此文章,对ssh的解释透彻易懂,对原理不熟悉的朋友推荐一看。
原理部分转自下面链接的部分内容
十分详细的原理阐述,如果对ssh的实现原理感兴趣可以看一下原文。本文只针对linux命令实现相关的部分做讨论。
1 SSH免密登录原理
如果不熟悉免密登录,可以先看2的部分,先自己配一遍免密登录,再来看该部分则会豁然开朗。
我们已经掌握如何使用ssh登录远程服务器了,但是每次登录都要输入密码,比较麻烦。ssh提供一种免密登录的方式:公钥登录。
- 在客户端使用
ssh-keygen
生成一对密钥:公钥+私钥 - 将客户端公钥追加到服务端的
authorized_key
文件中,完成公钥认证操作 - 认证完成后,客户端向服务端发起登录请求,并传递公钥到服务端
- 服务端检索
authorized_key
文件,确认该公钥是否存在 - 如果存在该公钥,则生成随机数
R
,并用公钥来进行加密,生成公钥加密字符串pubKey(R)
- 将公钥加密字符串传递给客户端
- 客户端使用私钥解密公钥加密字符串,得到R
- 服务端和客户端通信时会产生一个会话
ID(sessionKey)
,用MD5
对R和SessionKey
进行加密,生成摘要(即MD5
加密字符串) - 客户端将生成的
MD5
加密字符串传给服务端 - 服务端同样生成
MD5(R,SessionKey)
加密字符串 - 如果客户端传来的加密字符串等于服务端自身生成的加密字符串,则认证成功
- 此时不用输入密码,即完成建连,可以开始远程执行
shell
命令了
2 Linux实现
客户端test1
的aaa
用户 免密访问 服务器test2
的bbb
用户
为了更清晰的查看
带上了命令的执行用户及服务器名称
1 生成用户的私钥与公钥(对应原理1)
[aaa@test1 ~]# ssh-keygen
# 此过程中需要输入三个参数,但三个参数均允许为空,故此过程中只需要三次回车即可。
# 执行结束后,当前用户家目录下回生成一个隐藏文件 .ssh
# 查看一下该文件下内容,发现其中有 id_rsa 和 id_rsa.pub 两个文件
[aaa@test1 ~]# ll .ssh
2 将客户端的公钥发送给服务器(对应原理2)
[aaa@test1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub bbb@test2
也可以简写为
# 在test2上以bbb用户免密访问
ssh-copy-id bbb@test2
# 或者,在test2上以aaa用户免密访问
ssh-copy-id test2
命令执行后,会提示
bbb@test2’s password:
输入bbb的用户密码后回车,即完成了公钥的分发。
3 尝试以通过ssh以bbb用户访问test2(对应原理3-12)
[aaa@test1 ~]# ssh bbb@test2
Last login: Wed Apr 27 16:43:08 2022 from 192.168.37.1
[bbb@test2 ~]$
此过程未提示输入密码,且成功跳转到了bbb用户访问的test2,表示成功完成了免密登录。
(此时免密登录已经配置成功,后面内容只为理解原理做辅助。)
转到bbb用户的家目录下的.ssh文件夹
[bbb@test2 ~]$ cd ~/.ssh/
[bbb@test2 .ssh]$ ll
发现该目录下有authorized_keys
文件(若多个客户端向bbb的test2服务器配置了免密登录,还会有known_hosts
文件),查看该文件。
[bbb@test2 .ssh]$ cat authorized_keys
即可发现,该文件内容格式为
ssh-加密算法 客户端公钥 客户端用户名@客户端主机名
如果有配置多台免密登录的客户端,则有对应数量的如上格式内容。
到此为止,关于ssh免密登录,linux直接暴露表面的部分已经结束。本文介绍的只是最简单的免密登录配置,能满足一般的生产需要。但其中的命令都还有继续深挖的空间,感兴趣可以自己深入搜索学习。