使用 SSH 密钥进行身份验证可以免去每次都输入密码的繁琐操作,同时账户安全性也得到大幅提高。
那么如何做呢?小胖狐根据大佬韦世东的文章做了相关实践,并进行了干货总结。
SSH 文件默认存放在 ~/.ssh
目录下,如果你是 win 系统,你可以使用 git bash 进入这个目录来查看:cd ~/.ssh && ls
。也可以在资源管理器中查看,一般存放在 C:\Users\替换成你的用户名\.ssh
文件夹下。如果这个目录下什么文件都没有代表没有生成过 SSH 密钥,你可以后续生成一个,如果有了,你会看到 id_rsa
和 id_rsa.pub
这样的文件,前者为密钥,后者为公钥。
生成 SSH 密钥
如果你曾做过 Github 或 Gitee 等代码托管平台的 git 代码推送,可能生成过 SSH 密钥。如果没有,不用着急,打开 cmd 窗口,用下面的命令生成一下(命令使用会用到 ssh-keygen
工具,如果你执行生成命令后报这个工具找不到,请安装 Git 即可):
ssh-keygen -t rsa -C "vansenb@foxmail.com"
这里的邮箱 vansenb@foxmail.com
换成你自己的邮箱。大概解读一下代码的意思,意思是通过生成工具,生成一个 rsa 算法加密的密钥对,后面标注个人标识即邮箱。运行命令后,会咨询你密钥存放的位置、密码等信息,通常不需要做任何修改和填写,一路回车即可,最后会告诉你密钥对已经生成完成,默认就是放到了 ~/.ssh
目录下,这时候你再进去该目录,就可以看到了。
实现免密登录
通常情况下,我们会在 cmd 中用 ssh username@ip
命令登录服务器或使用一些三方工具登录,执行命令后终端会提示我们输入密码。更好的做法是借助 SSH 密钥帮助我们验证身份,直接省去输入密码的步骤。
如何操作呢?首先到你本机的 ~/.ssh
目录下,找到 id_rsa.pub
公钥文件,使用记事本打开,复制里面的全部内容。然后先用密码登录你的服务器,还是来到服务器的 ~/.ssh
目录下,看一下是否有这个文件 authorized_keys
,如果没有,请新建一个,如果有了,请打开编辑该文件,并将复制的公钥内容粘贴到这个文件中,使服务器认可我们的公钥,这一步有点类似 Github 上面添加公钥的过程我觉得。
在 linux 服务器上编辑的过程,如果你使用的是 vim 编辑器,那么命令如下:
$ cd ~/.ssh
$ vim authorized_keys
使用 vim 编辑器打开文件后按 i
键进入编辑模式,使用键盘快捷键 Ctrl + V
粘贴刚才复制的公钥字符串。接着按 ESC
键进入 vim 编辑器的命令行模式,输入 :wq
并回车保存。
此时我们可以在本地测试免密登录了,比如:
ssh root@10.1.1.1
然后按下回车即可,如果是第一次登录到这台云服务器,终端会提示:
The authenticity of host '10.1.1.1 (10.1.1.1)' can't be established.
ECDSA key fingerprint is SHA256:nGvmS+JKzQf1gG+Nzc0QN/qS6xSp1iV0rJFP1dILel4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
这时候我们输入 yes
并回车即可。回车之后终端给出了新的提示:
Warning: Permanently added '10.1.1.1' (ECDSA) to the list of known hosts.
Last login: Wed Dec 23 21:43:28 2020 from 111.94.33.65
Welcome to Cloud Elastic Compute Service !
[root@iZ1nmehZ ~]#
到这里,表示我们的免密登录成功!可以操作云服务器了!
免密登录测试仍然提示要输入密码怎么办?
当然,有部分同学会遇到,明明添加了公钥,免密登录还是提示需要输入密码的问题,这个小胖狐也遇到了,怎么办呢?这是因为有些服务器中的 sshd
服务配置并未开启公钥登录选项,这时候就需要我们到云服务器上开启 sshd
服务的公钥登录配置。
再次登录服务器,执行 vim /etc/ssh/sshd_config
命令,进入到 sshd
配置文件后找到 PubkeyAuthentication
项,按 i
进入编辑模式,将这一行的 #
的注释去掉,使之生效,同时,将该值的配置设置为 yes
。最终改好之后这一行正确的效果如下:
PubkeyAuthentication yes
然后还是按 ESC
键进入 vim 编辑器的命令行模式,输入 :wq
并回车保存。操作完之后重新启动 sshd 服务,重启命令为 service sshd restart
。
这时候再在本地测试免密登录,看是否能成功呢?
免用户名和免 IP 登录实现
上面的操作中,我们要记住要登录的用户名和对应的 IP 地址,而且如果 SSH 的端口号变了不是 22 的话,可能还会有连接问题,这个小胖狐曾感同身受,那么对于这种情况如何进一步做优化呢?可以通过配置 ~/.ssh/config
实现。默认情况下 ~/.ssh
目录下是没有 config
文件的,如果没有,我们可以自己创建一个。写入内容模板如下:
Host zsduo
HostName 10.1.1.1
User root
Port 22
IdentityFile ~/.ssh/id_rsa
- Host 后面写此配置的别名,你可以起一个你好记的名字
- HostName 写云服务器公网 IP 地址即可
- User 写登录的用户名
- Port 写 SSH 的端口号,如果端口号改了,请改成你的端口号
- IdentityFile 密钥文件位置,不管是 linux 还是 win 系统,就像我代码中所写的即可
完成配置之后,我们可以在 cmd 中尝试代码 ssh zsduo
即可发现登录成功,是不是非常方便呢?
本文源自公众号:NightTeam,小胖狐通过消化吸收重新组织了文字。