SSH密钥实现无密码登录服务器
对于需要频繁登录操作的服务器,每次都要输入服务器用户的密码显得过于麻烦,幸好SSH允许我们通过密钥来实现免密登录,本以为配置起来挺简单的,但还是遇到一些坑,所以记录一下
在服务器生成密钥
首先要在你想免密登录的服务器的用户的主目录创建目录.ssh来存放密钥文件,cd到.ssh目录,然后使用以下命令生成密钥:
1 | |
也可以不用rsa算法生成,但一定要保证待会在自己电脑上生成密钥的算法和在服务端的算法一致,这点很重要,因为有可能服务器的ssh版本与你电脑上的版本不一致,如果没有指定-t参数,就会使用默认的算法生成,而两者的默认算法并不一定一样。所以无论你想用什么算法,都明确指定-t参数。
然后将生成的公钥文件复制一份,命名为auth:
1 | |
检查服务器是否开启了密钥认证
这一步尤其重要,不是所有操作系统的服务器默认都开启这个功能的,我当初配置的时候就是漏了这一点
1 | |
在你的服务器上输入上述命令,/etc/ssh/sshd_config是ssh的配置文件,检查配置文件中的PubkeyAuthentication yes一行是否设置为yes,有可能是no,也可能是被注释的状态,改为yes并取消注释即可。
检查服务器的rsa支持
我们还需要在这个配置文件中为ssh添加rsa支持,如果你的服务器使用的是ssh3的话,默认是不启用rsa的,因为rsa算法安全性相对弱一些,添加完rsa支持后,你的sshd_config文件应该类似这样:
1 | |
告知服务器上的ssh使用指定的密钥文件
在刚才的内容上再加上下面这行:
1 | |
完成后,你的配置文件应该类似这样:
1 | |
重启ssh服务以应用配置
1 | |
在电脑上生成密钥
Linux/macOS
1 | |
Windows
进入C:\Users\<你的用户名>\文件夹,在其中新建.ssh文件夹,在该文件夹打开CMD,执行
1 | |
在本地生成完密钥后,将本地公钥中的全部内容复制到我们刚才在服务器上拷贝的auth文件末尾,注意一定要另起一行,你可以这样来做到这一点:首先把你本地的公钥文件通过SFTP传输到服务器上,然后使用以下命令:
1 | |
测试
使用ssh命令连接服务器
1 | |
如果没有输入密码直接连接上了就说明配置成功了
FQA
- 为什么我按照上面的步骤来了仍然需要输入密码才能连接?
检查你创建的~/.ssh目录和该目录下的密钥文件对于你所配置的用户有无访问权限,很有可能是权限问题
如果权限正确,那么请通过这个命令查看你的ssh日志,进行问题排查:sudo journalctl -u ssh -n 50 --no-pager