文章目录
问题总结
这段时间在学习ssh远程控制,并且尝试着配置无需密码的密钥验证方式,但是在将公钥发送过去并配置好相关配置,但是在客户端对服务器进行访问的时候仍然是需要密码的,在翻阅了无数的博客和教程并调试之后,才最终解决这个问题,因此我决定在这里对整个配置流程进行一个总结分析,以便于自己今后回顾,也给各位和我一样的ssh小白一个少走弯路的机会
配置准备
首先我们肯定需要安装好ssh的服务端与客户端,执行以下步骤
1. 更新源(在服务端和客户端都需要)
sudo apt-get update
2. 本地使用的安装客户端
sudo apt-get install openssh-client
3. 远程访问的安装服务端
sudo apt-get install openssh-server
在做好以上步骤后,正常来说,我们执行如下操作是可以通过密码远程访问服务端了
ssh [服务端的用户名称]@[服务端ip地址]
配置密钥访问以实现无需密码
但是每次访问都需要输入密码其实蛮麻烦的,所以我们在这里配置一下密钥访问。
密钥访问的大概原理应该是客户端将一个公钥放置于服务端,在每次客户端申请访问的时候,服务端会用公钥加密一个数据,然后发送给客户端使其用私钥解密并发送返回,通过判别两个数据是否相同来判断客户端是否可信。
生成密钥
放置密钥的目录都在用户目录下,于是我们在客户端与服务端都创建一个 .ssh 目录。
mkdir ~/.ssh
然后我们进入客户端的.ssh目录,在其中创建密钥。
ssh-keygen -t [encryption_method] -f [key_name]
上述指令会在 .ssh 文件夹中创建两个密钥:名称为 “key_name” 的私钥与名称为 “key_name.pub” 的公钥,这两个密钥都使用你所指定的 “encryption_method” 加密算法加密。
ps:这里的 -t 参数与 -f 参数都是可以省略的。
-t 省略:默认使用 RSA 算法
-f 省略:key_name
默认为 id_rsa
如果使用了 -f 参数,在后续的配置中需要在 .ssh 目录下添加一个 config 文件,用以确保密钥验证过程中能够正确的使用指定的私钥。
传送公钥给服务端
这里传送公钥使用 scp
指令,scp指令的详细用法可以上网查阅,我这里就直接写了
scp [key_name.pub] [user]@[host]:[remote_folder]
上述指令中,key_name.pub
指公钥名(注意此处执行指令时是在 .ssh 目录下),user
指目标主机中的用户,也就是你在服务端创建 .ssh 目录时的用户,host
为主机ip,remote_folder
指要放入的目录,这里应该是 user 下的 .ssh 目录。
比如我当时使用的就是下面这样的:
scp rsa_key.pub test@master:/home/test/.ssh/
值得一提的是上面的 host
选项中应该是 ip 的地方我改成了 master,这里是我修改了 hosts 文件建立了一个映射,这里的 master 作用就相当于一个 ip,该方法我在后续会提到。
将服务端的密钥整合
一般情况下服务端会拥有不只一个密钥,因为肯定不止一个客户端会访问服务端,因此,要将公钥整合为一个,正常情况下,我们都是用一个名为 authorized_keys
的文件来整合公钥。
进入服务端,按照如下步骤整合公钥:
- 查看是否拥有
authorized_keys
cd ~/.ssh
ls
查看输出是否有 authorized_keys
。
- 如果没有,则创建该文件
touch authorized_keys
- 将公钥附加进去
cat [file_name] >> authorized_keys
到这一步,我们基本所有的步骤就完成了,但是还有一点很重要的事情,就是要设置权限,ssh对密钥文件的权限设置要求很高,我们权限求改如下
cd ~
chmod 700 ~/.ssh
cd ~/.ssh
chmod 600 authorized_keys
到这一步,如果不考虑其他的 ssh 配置问题,就基本结束了,接下来,我们要来配置 ssh 的一些设置文件了。
ssh配置文件
修改sshd_config文件
首先我们要去修改一下 sshd_config 文件,以确保我们的 ssh 服务能够使用密钥验证方式
sudo vim /etc/ssh/sshd_config
这个文件里面有一堆被 #
注释的文件,在其中找到 PubkeyAuthentication
AuthorizedKeysFile
这两个条目,删去前面的注释符号,将其修改如下:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
这是为了使得 ssh 服务可以使用 authorized_keys
来进行 ssh 密钥验证。
建立hosts映射(可选)
这一步可做可不做,做了的话就是能够像我之前所写的那样,能够将 master 识别为一个 ip。
sudo vim /etc/hosts
然后在里面按照这样的格式添加。
[ipaddress] [name]
然后你就能用 name
替代 ipaddress
了。
.ssh 目录下的 config 文件建立
这里我只提一下,在你使用自己定义的名字来创建密钥时,你需要创建并配置这个文件,我具体也没有很吃透,如果有需要,可以去翻一下其他帖子,我能力有限。
收尾
在上面这些都做好后,我们就能直接 ssh 服务端而不需要密码了。