介绍
SSH原理其实是非对称加密。即公钥加密私钥解密
免密登录原理:
即事先将RSA非对称加密的公钥由主节点拷贝到到其他节点,只需实现主节点至其他节点的免密即可
流程如下:
- Client将自己的公钥存放在Server上,追加在文件authorized_keys中。
- Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey®,然后将加密后信息发送给Client。
- Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
- Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
- Server端会最后比较Digest1和Digest2是否相同,完成认证过程。
流程摘自此链接,详细介绍可以参考
1. 环境准备
1、两台能相互ping通的机器
![在这里插入图片描述](https://img-blog.csdnimg.cn/3a179746c4f740bc96bd417213ccef67.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6B5YWJ56i76I2J5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
2. 环境搭建
- 去掉/etc/ssh/sshd_config的注释,打开RSA非对称密钥验证,所有节点都须操作
# 编辑文件
vim /etc/ssh/sshd_config
# 去掉注释
#PubkeyAuthentication yes
其他版本也可能需要去掉这个的注释,没有就不用
#RSAAuthentication yes
- 生成密钥对
# 如果没有这个命令,用yum安装
ssh-keygen -t rsa
#接下来需要输入一些信息,如名字等,推荐直接回车
[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0i8s207/is2mg9cGWhvzBIPZF8pUIXvFDz2oYHbtWss root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| ..o+.o |
| =oo.= o |
| O.+.+ o . |
| o.*.o o . |
| . S+ + . |
| o=.o E |
| .++O. |
| o=+*= |
| .o===o. |
+----[SHA256]-----+
- 创建authorized_keys文件
通过之前介绍的流程可以知道,如果node1 想要ssh node2,则node2必须含有node1的公钥,
如果节点比较对,推荐直接在一个文件里写入所有的pub key 然后传到其他节点上。
这是我本地虚拟机的密钥,你们看了也没啥,哈哈,了解下生成的样子
[root@localhost .ssh]# cat id_rsa.pub >> authorized_keys
[root@localhost .ssh]# ls
authorized_keys id_rsa id_rsa.pub
[root@localhost .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDM9PpE3mg5OLS2GkRkA/F8U3MNUOJ2M/WdujY0RXfjRqRdojOXyryQ6FfInTKjkIj+GX6KTgYq7eTUeykZqcxclxu8NaDWcQeT2ANjO7XoHwuGFCVlRfnXJ3AeALttcyhhYH6dTKSwqW9om34IV16aFm3rGZ2Biim03nB4EK5kFjwPMxECiyKI8Y66pIHvnlBQqRm0UzP22y4u5GktHxNBtSzom875cWDJ953gS6spPraLg34tSyDaARYBHy1e+pvCPzaHhSjZ6w3ZcwIM6cuuOeCwVuODRb1DoRXmSI3EzU71Ffku8E0yoVrtnauhij7vKt3ad4keNlAHOOKslNmp root@localhost.localdomain
因为我有五个节点,所有最后生成的key是这样的:
![在这里插入图片描述](https://img-blog.csdnimg.cn/1fd52d2b6284492a87d096e1b1853605.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6B5YWJ56i76I2J5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
然后将相通的内容传到其他节点上,就可以实现ssh登录了。
测试:
我们有两台节点:
![在这里插入图片描述](https://img-blog.csdnimg.cn/cefa03e80fbb41cab6591d3944af5630.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6B5YWJ56i76I2J5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/40b5bebb4a624b6e882558f3b8651ff2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p6B5YWJ56i76I2J5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16)