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
,查看下面几个参数
cat /etc/ssh/sshd_config | grep -P "(AuthorizedKeysFile )|(PubkeyAuthentication )|(PasswordAuthentication )"
# 输出如下
# #PubkeyAuthentication yes
# AuthorizedKeysFile .ssh/authorized_keys
# #PasswordAuthentication yes
# PasswordAuthentication no
确保下面的配置正确,PasswordAuthentication
允许通过输入密码访问,重要的是设置PubkeyAuthentication
,这是密钥访问的关键
# /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication yes
修改配置后,执行重启 sshd 服务
$ systemctl restart sshd
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 端通过私钥进行登录
# 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 注释
Server Linux 环境生成密钥
Server 端生成密钥,将公钥添加到 authorized_keys
文件,配置 PubkeyAuthentication
为 yes,将私钥保存到 Client 端,Client 端通过私钥进行登录
# 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 注释
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)