理解 SSH 免密登录

偏向技术
/ 0 评论 / 114 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年07月28日,已超过847天没有更新,若内容或图片失效,请留言反馈。

ssh 登录如果经常需要输入密码非常麻烦,所以为了省事和安全,进行配置密钥登录,ssh 免密登录根据 Client 环境分为 Linux 和 Windows,Linux 下只需几步即可进行免密登录,Windows 下的步骤要稍微多一点(之前写的免密登录,自己都有点看不懂了,这里重新理解一下 表情

密钥登录

Server 端(被连接的一端)存储公钥,Client 端(使用 ssh 命令的一端)存储私钥,Client 端通过私钥进行 ssh 登录,从这里可以知道,只要保证一对生成的密钥,公钥存在 Server 端,并且允许授权登录,私钥存在 Client 端,Client 端就可以进行登录,那么在 Server 端生成密钥还是在 Client 端生成密钥?这可以根据自身情况进行指定,下面是几个概念

Server 端 和 Client 端

Server 端指的是 Linux 环境,需要被远程连接的一端

Client 端需要通过命令行进行连接的一端,可以是 Linux、Mac OS、Windows

Server 端 和 Client 端这里是指它的作用,不特定某一台机器

authorized_keys 和 known_hosts

authorized_keys 是在 server 端的一个文件,这个文件保存了一组公钥列表,只有被保存在该文件里面的公钥,才能允许 Client 端通过相同公钥对应的私钥进行授权登录,需要注意的是,如果已经存在有 authorized_keys 文件,要确保当前其中的公钥列表没有被人使用,才能进行覆盖,否则请通过追加,添加在内容后面

known_hosts 是在 client 端的一个文件,当进行 ssh 连接时,会提示是否保存,输入yes之后,会在 known_hosts 中保存一份 IP 信任列表,当 Server 端重装系统或者其他操作时,Client 端出现连接不上的情况,需要手动删除 known_hosts 中保存的 Server 端 IP

/etc/ssh/sshd_config

ssh 的配置文件,修改 Server 端的 /etc/ssh/sshd_config,查看下面几个参数

bash
cat /etc/ssh/sshd_config | grep -P "(AuthorizedKeysFile )|(PubkeyAuthentication )|(PasswordAuthentication )"

# 输出如下
# #PubkeyAuthentication yes
# AuthorizedKeysFile .ssh/authorized_keys
# #PasswordAuthentication yes
# PasswordAuthentication no
1234567

确保下面的配置正确,PasswordAuthentication 允许通过输入密码访问,重要的是设置PubkeyAuthentication,这是密钥访问的关键

bash
# /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication yes
123

修改配置后,执行重启 sshd 服务

bash
$ systemctl restart sshd
1

SSH 命令

ssh-keygen

ssh 生成一对公钥和私钥的命令

Linux (以腾讯云服务器为例)下默认 ssh 位置是/root/.ssh,命令默认生成的私钥文件是/root/.ssh/id_rsa,公钥文件是/root/.ssh/id_rsa.pub

Windows 下默认 ssh 位置是$home\.ssh,命令默认生成的私钥文件是$home/.ssh/id_rsa,公钥文件是$home/.ssh/id_rsa.pub

这里需要注意的是,如果已经通过ssh-keygen生成了一对默认的密钥,那么再次生成将会覆盖同名的密钥

ssh-copy-id

ssh-copy-id -i /root/.ssh/id_rsa.pub root@x.x.x.x

将公钥(文件名称带.pub的)添加到 Server 端,如果 Client 端是 Linux 环境,这个就很方便

Client Linux -> Server Linux

Client Linux 环境通过 ssh 免密登录 Server Linux,修改 /etc/ssh/sshd_config 需要重启 sshd 服务才能生效systemctl restart sshd

所有操作都是以 root 用户为例

Client Linux 环境生成密钥

Client 端生成密钥,将公钥保存到 Server 端,添加到 authorized_keys 文件,Server 端配置 PubkeyAuthentication 为 yes,Client 端通过私钥进行登录

bash
# Client Linux 环境

# 建议修改保存的名称,防止后续冲突,以 /root/.ssh/kkk 为例
$ ssh-keygen
# 下面是命令行提示步骤
Generating public/private rsa key pair.
# 下面位置填入 /root/.ssh/kkk
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/kkk
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/kkk.
Your public key has been saved in /root/.ssh/kkk.pub.

# Server 端要将 PasswordAuthentication 设置为 yes, 才能通过密码登录
$ ssh-copy-id -i /root/.ssh/kkk.pub root@<Server IP>
root@<Server IP>'s password:

# 这里是保存在 /etc/ssh/sshd_config 中的 AuthorizedKeysFile 位置
# 查看公钥列表
$ cat .ssh/authorized_keys
# 退出 ssh
$ exit

# 无需密码,通过私钥进行登录
$ ssh -i /root/.ssh/kkk root@<Server IP>

# 为了访问安全,设置仅通过密钥登录
# 将 PasswordAuthentication 设置为 no 或者将 PasswordAuthentication 注释
12345678910111213141516171819202122232425262728

Server Linux 环境生成密钥

Server 端生成密钥,将公钥添加到 authorized_keys 文件,配置 PubkeyAuthentication 为 yes,将私钥保存到 Client 端,Client 端通过私钥进行登录

bash
# Server Linux 环境

# 建议修改保存的名称,防止后续冲突,以 /root/.ssh/kkk 为例
$ ssh-keygen
# 下面是命令行提示步骤
Generating public/private rsa key pair.
# 下面位置填入 /root/.ssh/kkk
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/kkk
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/kkk.
Your public key has been saved in /root/.ssh/kkk.pub.

# 将公钥追加到 authorized_keys 文件,切勿直接覆盖(习惯
$ cat /root/.ssh/kkk.pub >> .ssh/authorized_keys

# 查看私钥
$ cat /root/.ssh/kkk

# 将私钥添加到 Client Linux,有两种方式
# 1. 直接复制
# Client Linux 直接创建文件 /root/.ssh/kkk,将查看到的私钥复制进文件
# 2. scp 将私钥下载到 Client Linux 环境
# 确保 Client Linux /etc/ssh/sshd_config 文件中的
# PasswordAuthentication 设置为 yes, 才能通过密码登录
# 否则报 Permission denied (publickey,gssapi-keyex,gssapi-with-mic) 错误
# 输入密码即可
$ scp /root/.ssh/kkk root@<Client IP>:/root/.ssh/kkk

# 确认 Server Linux /etc/ssh/sshd_config 文件中 PubkeyAuthentication 设置为 yes
# 注意前面不能有 # 号, # 号代表该行注释
$ cat /etc/ssh/sshd_config | grep -P "PubkeyAuthentication "

#
# 进入 Client Linux 环境
# 无需密码,通过私钥进行登录
$ ssh -i /root/.ssh/kkk root@<Server IP>

# 为了访问安全,设置仅通过密钥登录
# 将 Client Linux PasswordAuthentication 设置为 no 或者将 PasswordAuthentication 注释
12345678910111213141516171819202122232425262728293031323334353637383940

Client Windows -> Server Linux

Client Windows 环境生成密钥

使用 git bash 终端进行操作,和上面的 Client Linux 环境操作步骤类似

Server Linux 环境生成密钥

和上面的 Server Linux 环境操作步骤类似,复制到 Client Windows 时无法通过 scp 命令,建议直接新建文件,如果提示有Load key "d:/xxx": invalid format错误,需要注意私钥文件的最后一行需保留一行空行

最后

要实现免密登录的操作,有几个点需要注意,Server 端 /etc/ssh/sshd_config 文件中的 PubkeyAuthentication 设置为 yes,公钥保存在 Server 端并且添加到 Server 端的 authorized_keys 文件内,Client 端通过私钥进行登录,只要保证这几点,就可以实现免密登录

最后一个建议公有云服务器将 PasswordAuthentication 设置为no或者注释掉

0

评论 (0)

取消