更新以前博客的内容发现,关于 SSH 公钥登录的坑一直没填,就趁今晚写了写。
SSH 远程连接有两种方式,密码登录和公钥登录。开放密码登录到外网是十分危险的,可能会被有心人利用密码库撞出来。而公钥验证则完全没有这方面的顾虑,仅开放公钥验证登录的情况下,服务器只允许将公钥上传保存在本地的客户端登录,其他一概拒绝。
我们假定,服务器上已经有了一个 test 用户,家目录是 /home/test
,要给 test 用户配置 SSH 公钥验证。
生成公私钥对
本地执行命令:
1 | ssh-keygen -t rsa -C "i@xlui.me linux" |
-C 参数后附带的是 comment,自己定义即可。
Windows下直接在 git bash 中运行以上命令,会在 C:\Users\USERNAME\.ssh
下生成公私钥对。Linux 下会在 /home/USERNAME/.ssh
下生成公私钥对。
我们只需要上传公钥(id_rsa.pub
)到服务器。注意,私钥任何情况下都不能暴露到网络上。
上传公钥
1 | scp -P PORT /path/to/.ssh/id_rsa.pub test@ip: |
- PORT 是服务器 ssh 的端口号,默认是 22(即没有修改 ssh 配置文件)
- test 是服务器上要使用公钥验证登录的用户名
- ip 是服务器 IP 地址(公网)
如果以上信息无误,会提示输入用户 test 的密码,然后进行上传。上传后的文件在 /home/test/id_rsa.pub
。
配置 SSH
以下配置在 ssh 配置文件中并非相邻,自行查找并在相应位置进行修改(没有则添加)。
1 | vim /etc/ssh/sshd_config |
修改完成后重启 ssh:
1 | systemctl restart sshd |
写入公钥
服务器端将本地上传上来的公钥写入 test 用户的 /home/test/.ssh/authorized_keys 文件,从而实现本地免密登录:
1 | su - test |
这样,在本地尝试 ssh 远程登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥(~/.ssh/authorized_keys
)进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。