概要
本文介绍如何在客户端侧配置 SSH 公钥认证,以便安全地连接至服务器。适用于 Windows 与 Linux 系统。
前提条件
- 系统自带 SSH 客户端(Windows 10 及以上版本、Linux 通常已内置)
- 服务器已启用公钥认证
- 目标服务器上存在对应的登录用户
密钥类型与加密方式
SSH 常用的密钥类型包括 RSA、ECDSA 与 Ed25519。以下表格对比了它们的特点与推荐用途。
| 密钥类型 | 特点 | 推荐用途 | 兼容性 |
|---|---|---|---|
| RSA | 历史悠久,支持可变密钥长度,兼容性好 | 兼容性优先的环境 | 极高 |
| ECDSA | 使用椭圆曲线算法,性能优于 RSA | 性能优先的环境 | 中等 |
| Ed25519 | 新标准,安全且高效,密钥短 | 新部署、重视安全的环境 | 仅限较新 SSH 实现 |
目前推荐使用 Ed25519。自 OpenSSH 6.5(2014 年发布)起已支持。RSA 仍为兼容性最佳的选择,而 ECDSA 处于二者之间。
变量说明
下表展示了文中使用的环境变量示例:
| 变量名 | 示例值 | 说明 |
|---|---|---|
<<USERNAME>> |
exampleuser |
本地登录用户名 |
<<SERVER>> |
192.168.1.10 |
服务器地址或主机名 |
<<USER>> |
ubuntu 或 ec2-user |
服务器登录用户名 |
<<EMAIL_ADDRESS>> |
user@example.com |
可选:公钥注释邮箱 |
关于 Windows 命令执行
所有命令均基于 PowerShell。若不可用,可改用 cmd(命令提示符)。
$env:USERPROFILE在 cmd 中对应%USERPROFILE%。
Windows 客户端设置
Step 1: 生成密钥对
以管理员身份打开 PowerShell:
ssh-keygen -t ed25519 -C "<<EMAIL_ADDRESS>>"
注:
-C为注释,可选。
为方便自动化,以下步骤默认不设置密码短语。
输出示例:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/C:/Users/<<USERNAME>>/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Your identification has been saved in /C:/Users/<<USERNAME>>/.ssh/id_ed25519
Your public key has been saved in /C:/Users/<<USERNAME>>/.ssh/id_ed25519.pub
公钥:
$env:USERPROFILE\.ssh\id_ed25519.pub
私钥:$env:USERPROFILE\.ssh\id_ed25519
Step 2: 上传公钥至服务器
cat $env:USERPROFILE\.ssh\id_ed25519.pub | ssh <<USER>>@<<SERVER>> "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys"
或手动复制内容至服务器的 ~/.ssh/authorized_keys。
Step 3: 测试连接
ssh -i $env:USERPROFILE\.ssh\id_ed25519 <<USER>>@<<SERVER>>
首次连接需输入 “yes” 确认指纹。
Linux 客户端设置
Step 1: 生成密钥对
ssh-keygen -t ed25519 -C "<<EMAIL_ADDRESS>>"
注:同样不设置密码短语以便自动化使用。
输出示例:
Enter file in which to save the key (/home/<<USERNAME>>/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
公钥:
~/.ssh/id_ed25519.pub
私钥:~/.ssh/id_ed25519
Step 2: 上传公钥至服务器
使用 ssh-copy-id 自动完成:
ssh-copy-id -i ~/.ssh/id_ed25519.pub <<USER>>@<<SERVER>>
或手动复制至 ~/.ssh/authorized_keys。
Step 3: 测试连接
ssh -i ~/.ssh/id_ed25519 <<USER>>@<<SERVER>>
使用带密码短语的密钥
若密钥设有密码短语,可启用 SSH Agent 保存会话凭据。
Step 1: 启动 SSH Agent
Windows:
Set-Service -Name ssh-agent -StartupType Manual
Start-Service ssh-agent
Linux:
eval "$(ssh-agent -s)"
自动启动设置:
- Windows:
Set-Service -Name ssh-agent -StartupType Automatic
- Linux:
在~/.bashrc或~/.profile添加:
eval "$(ssh-agent -s)" > /dev/null
Step 2: 注册密钥
Windows:
ssh-add $env:USERPROFILE\.ssh\id_ed25519
Linux:
ssh-add ~/.ssh/id_ed25519
注册后即可免输入密码短语。
Step 3: 确认状态
ssh-add -l
若显示指纹则说明注册成功。
使用 SSH 配置文件(config)
创建或编辑 ~/.ssh/config
(Windows 路径:C:\Users\<<USERNAME>>\.ssh\config)
示例
Host myserver
HostName <<SERVER>>
User <<USER>>
IdentityFile ~/.ssh/id_ed25519
Port 22
Windows 需写为:
IdentityFile $env:USERPROFILE\.ssh\id_ed25519
使用方法:
ssh myserver
多服务器示例
Host web
HostName 192.168.1.10
User ubuntu
IdentityFile ~/.ssh/id_ed25519
Host db
HostName 192.168.1.11
User ec2-user
IdentityFile ~/.ssh/id_ed25519
建议不同服务器使用不同密钥,分别指定
IdentityFile。
验证连接
查看详细日志:
ssh -vvv -i ~/.ssh/id_ed25519 <<USER>>@<<SERVER>>
出现 Authentication succeeded (publickey) 即代表成功。
故障排查
常见原因:
- 服务器未启用公钥认证
检查/etc/ssh/sshd_config中PubkeyAuthentication yes。 - 公钥未正确注册
确认~/.ssh/authorized_keys权限为 600。 - 连接信息错误或权限问题
用户或主机名错误、文件属主不匹配等。
总结
通过 SSH 公钥认证可避免明文密码,提高连接安全性。
Windows 与 Linux 均可使用 ssh-keygen 快速生成密钥,并通过配置文件实现高效管理。
