简介

当拥有一台服务器时,最先保证的是安全,而保证安全的方式有很多,譬如避免开放过多的端口,尽量避免使用默认端口,登录口令尽量复杂,其中登录口令是进入服务器的第一道防线,但有时候复杂的口令即阻挡了外来人也阻挡正常登录(密码太复杂了),所以有没有一种既简单又能有效防止被破解的方法呢?当然有,免密登录就是最简单有效的方法

步骤

1、在windows系统的cmd命令行上执行生成密钥对命令

1
ssh-keygen

其实我们应该指定生成密钥的文件名、备注来区分不同的密钥,避免使用同一份密钥,防止丢失密钥时需要在各代码托管平台逐一上传

感谢博主张时贰的指点

例子:

1
2
ssh-keygen -t rsa -C "Ubuntu" -f "tecent_VPS"     # 给服务器的Ubuntu用户
ssh-keygen -t rsa -C "GC-ZF" -f "id_rsa_github" # 给Github下GC-ZF的账号

参数解释

参数解释
-t rsa采用rsa加密方式
-f生成文件名
-C备注

2、将生成的id_rsa.pub公钥内容复制到远程服务器上的/.ssh/authorized_keys(不存在则手动创建)

1
2
touch /.ssh/authorized_keys #文件不存在时手动创建
vim /.ssh/authorized_keys #编辑authorized_keys文件

3、导入密钥,打开xshell->工具->用户密钥管理者->导入选项,导入刚刚生成的id_rsa密钥文件

4、登录服务器,选择密钥登录并选择刚刚导入成功的密钥文件,即可完成无密码登录。

5、(可选)取消密码登录,加强服务器安全性。

1
2
3
vim /etc/ssh/sshd_config #编辑ssh配置文件
#将PasswordAuthentication处的值改为no
service sshd restart #重启ssh服务

原理

免密登录服务器利用非对称加密原理,简单来说使用两个密钥(公钥和私钥),公钥加密传输数据,私钥解密接收数据;公钥是公开的,私钥是保密的。

免密登录原理如下( 图片来自于网络)

免密登录原理

图解,server A免登录到server B:
1、在A上生成公钥私钥。
2、将公钥拷贝给server B,要重命名成authorized_keys(从英文名就知道含义了)
3、Server A向Server B发送一个连接请求。
4、Server B得到Server A的信息后,在authorized_key中查找,如果有相应的用户名和IP,则随机生成一个字符串,并用Server A的公钥加密,发送给Server A。
5、Server A得到Server B发来的消息后,使用私钥进行解密,然后将解密后的字符串发送给Server B。Server B进行和生成的对比,如果一致,则允许免登录。

参考文章

非对称加密工作原理