使用公钥连接 SSH

每次 ssh 登录服务器都要重新输入一次密码?记住密码又怕不安全?

前言

每次 ssh 登录服务器都要重新输入一次密码?记住密码又怕不安全?一个更好的解决办法是使用公钥文件,只需一键点击,就可登录到远程服务器。

环境配置

  • Win10 本地主机

  • 远程 Linux 服务器

  • Xshell 客户端

关键步骤

分为本地端和服务端,分别进行设置。

本地端

主要是生成本机的密钥,有两种方式,一种是Xshell 软件生成,另一种是通过一行代码。

方法一:Xshell 生成

  1. 新建连接 –> 选择 Public Key 方式 –> 浏览 –> 用户密钥,点击 生成,软件会自动生成2048位的公共密钥

  2. 保存密钥到本机指定位置,推荐 C:\Users\<username>\.ssh文件夹,还可以为密钥文件加密存储

Xshell 生成的公共密钥

方法二

之前在 GitHub 登录时使用过,可输入下列命令,由系统自动生成,保存位置同样在 C:\Users\<username>\.ssh文件夹

1
2
3
4
git config --global user.name "用户名" #GitHub登录时选用
git config --global user.email "邮箱地址" #GitHub登录时选用

ssh-keygen -t rsa -C '上面的邮箱'

按照提示完成三次回车,即可生成 ssh key。通过查看 C:\Users\<username>\.ssh\id_rsa.pub 文件内容,获取到你的 SSH key

服务端

  1. 登录远程服务器,生成密钥对
1
ssh-keygen -t rsa

注:生成的密钥文件保存在~/.ssh文件夹内

2.1 手动上传本地密钥到远程主机

本段为根据 SSH 密钥登录 增补的内容,只需一行代码,自动上传并完成 #2.2 手动的工作。

使用 ssh-copy-id 命令:自动上传公钥

1
ssh-copy-id -i id_rsa_233 user@host

-i 参数用来指定公钥文件,user是所要登录的账户名,host是服务器地址。

公钥文件可以不指定路径和.pub后缀名,ssh-copy-id会自动在~/.ssh目录里面寻找,要做的只是把公钥文件名写对。

注意: ssh-copy-id是直接将公钥添加到authorized_keys文件的末尾。如果authorized_keys文件的末尾不是一个换行符,会导致新的公钥添加到前一个公钥的末尾,两个公钥连在一起,使得它们都无法生效。

2.2 上传本地密钥到远程主机

上传本地生成的 id_rsa_233.pub 密钥文件到远程主机,可以 sftp 上传(路径 ~/.ssh/ ),也可通过以下命令:

1
2
#本地主机上传命令
scp ~/.ssh/id_rsa_233.pub <username>@<ip>:/home/<username>/.ssh/id_rsa_233.pub
  1. 服务端授权
1
2
sudo cat ~/.ssh/id_rsa_233.pub >> authorized_keys
chmod 600 authorized_keys
  1. 修改 sshd 配置文件
1
sudo nano /etc/ssh/sshd_config

在文件最末尾加入下列代码并保存:

1
2
3
4
5
6
7
RSAAuthentication yes  
PubkeyAuthentication yes  
AuthorizedKeysFile /home/<username>/.ssh/authorized_keys 
# 会到当前用户下的authorized_keys文件中寻找key
## 如需要连两个账号,可在 `AuthorizedKeysFile`后加个空格继续填写,连 root 账号,根目录是在 `/root/.ssh/`
### 建议关闭密码登录
#PasswordAuthentication no
  1. 重启 sshd 服务
1
service sshd restart

至此,就可以在本机实现无密码登录服务端啦~

Ref

Changelog

  • 210913 增补自动上传公钥的内容
  • 210825 订正上传到远程主机的有误表述
  • 210820 init
查看评论