一、为什么使用公私钥登录#
- 安全性更高
- 密码复杂性问题:密码登录通常需要用户记住复杂的密码,但很多人为了方便会选择简单密码,这容易被暴力破解。而公私钥登录使用的是非对称加密技术,私钥的长度通常较长(如 4096 位),破解难度极大。(公网中暴露 22 端口的 ssh 服务每天都会收到大量爆破密码的登录请求,我查看日志每天都有上千次)
- 防止中间人攻击:公私钥认证机制在加密过程中可以有效防止中间人攻击。即使攻击者截获了通信内容,也无法获取私钥或解密数据。
- 无密码泄露风险:在公私钥登录过程中,私钥始终保存在本地,不会像密码登录那样通过网络传输,因此不存在密码在传输过程中被截获的风险。
- 登录更便捷
- 无需手动输入密码:一旦配置好公私钥登录,用户无需手动输入密码即可快速登录服务器,大大提高了工作效率,尤其适合频繁登录服务器的场景。
- 支持多台服务器:可以将同一个公钥添加到多台服务器上,使用同一对密钥登录多台服务器,简化了登录过程。(但同时如果私钥文件丢失或泄露,也会发生连锁反应)
- 自动化操作:公私钥登录支持无密码登录,便于实现自动化脚本操作 (使用 python fabric 库自动部署),例如通过 SSH 执行远程命令、文件传输等
- 可扩展性强
- 易于管理:公钥可以方便地分发给多台服务器,而私钥只需在本地妥善保管。如果需要更换密钥,只需重新生成密钥对并将新的公钥上传到服务器即可。
二、生成密钥对#
要想使用公私钥登录服务器首先需要生成密钥对,可以在本地计算机使用 ssh-keygen
命令生成密钥对。
ssh-keygen
命令需要安装 OpenSSH 客户端
以 Windows11 为例,在设置 > 系统 > 可选功能 搜索 OpenSSH 安装客户端,使用powershell
查看是否安装
> gcm ssh-keygen
CommandType Name Version Source
----------- ---- ------- ------
Application ssh-keygen.exe 9.5.3.1 C:\Windows\System32\OpenSSH\ssh-keygen.exe
- 生成密钥对命令,
ssh-keygen -t rsa -b 4096
-t rsa
:指定密钥类型为 RSA。-b 4096
:指定密钥长度为 4096 位,更高的密钥长度意味着更强的安全性
回车后会提示你输入保存密钥的文件路径和可选的密码,不需要密码直接按回车跳过即可。
默认情况,密钥会保存在 ~/.ssh/id_rsa
(私钥)和 ~/.ssh/id_rsa.pub
(公钥),在 Windows 上一般在C:\Users\<用户名>\.ssh
下
例如在我这里
24123@lolik ~\.ssh
> ls
目录: C:\Users\24123\.ssh
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/2/19 10:03 210 config
-a---- 2024/6/7 14:43 3381 id_rsa
-a---- 2024/6/7 14:43 738 id_rsa.pub
-a---- 2025/2/19 9:57 5828 known_hosts
-a---- 2025/2/19 9:52 5080 known_hosts.old
known_hosts 可能保存着连接过的服务器公钥,我的 config 是 vs code 保存的远程连接信息创建的,包含别名和主机名等
- 简化连接操作
在上述 config 文件中 (没有可以自己创建) 例如:
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host winserverA
HostName 1.1.1.1
User administrator
IdentityFile ~/.ssh/id_rsa
Host serverB
HostName 1.1.1.1
User root
IdentityFile ~/.ssh/id_rsa
-
Host
:为服务器设置一个别名,方便记忆。 -
HostName
:服务器的 IP 地址。 -
User
:服务器的用户名。 -
IdentityFile
:私钥文件路径。IdentityFile
似乎默认是~/.ssh/id_rsa
因为我使用
ssh 别名
或ssh username@ip
命令可以直接登录,没有指定-i ~/.ssh/id_rsa
三、将公钥上传到服务器#
- 将公钥内容复制到剪贴板
cat ~/.ssh/id_rsa.pub
选择输出内容复制
-
登录服务器,使用密码或者其他方式
在服务器上,家目录~下创建
.ssh
目录(如果不存在), 并修改权限mkdir -p ~/.ssh chmod 700 ~/.ssh
使用 vi 或者 vim 创建~/.ssh/authorized_keys
vim ~/.ssh/authorized_keys
粘贴公钥并保存
-
修改服务器 ssh 配置
编辑
/etc/ssh/sshd_config
文件vim /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
允许公钥验证和指定公钥文件
PermitRootLogin
设置为prohibit-password
或without-password
,禁用 root 用户的密码登录,仅允许公钥登录。
-
重启 sshd 服务使配置生效(也可使用老命令
service
)sudo systemctl sshd restart
-
登录测试
例如 在本地计算机终端输入,server_ip 是服务器 ip (如果根据上面在 config 配置了别名,也可使用别名登录)
ssh root@server_ip
本地如果是首次登录会显示警告,输入 yes 即可
不出意外会直接登录服务器,也是相当便捷