本文聚焦「更安全、更省心」的 SSH 使用方式:只用密钥登录、关闭密码、最小化暴露面、以及不同平台(Linux/macOS/Windows)常见差异。

1. 先搞清楚:SSH 到底在做什么

 • SSH(Secure Shell) 是远程登录与远程执行命令的通道,默认服务端端口为 22。

 • 你需要关心两件事:

 • 客户端:发起连接的一端(你的电脑)

 • 服务端:提供 SSH 登录的一端(服务器/NAS/路由器等)

 • 推荐的安全基线:

 • 使用 密钥认证(Public Key Authentication)

 • 禁用密码登录

 • 禁用 root 直接登录(改用普通用户 + sudo)

 • 尽量只对可信来源开放(防火墙/跳板机/内网)


2. SSH 密钥与算法类型:选什么更合适

SSH 的密钥是“一对”:私钥(private key) + 公钥(public key)

 • 私钥:留在客户端,不要泄露,不要上传到服务器。

 • 公钥:放到服务端(~/.ssh/authorized_keys)。

常见密钥类型(推荐顺序):

 2. Ed25519(推荐)

 • 安全性好、速度快、密钥短

 • 大多数现代系统默认支持

 3. ECDSA

 • 兼容性不错,但历史上不同实现差异较多

 4. RSA

 • 兼容性最好,但建议至少 3072 或 4096 位

 • 老旧系统可能只支持 RSA

建议:

 • 新环境优先用:ed25519

 • 需要兼容老设备/嵌入式:再考虑 rsa


3. 生成 SSH 密钥(客户端操作)

3.1 Linux / macOS

推荐生成 Ed25519:

ssh-keygen -t ed25519 -a 64 -C "your_email@example.com"

说明:

 • -a 64:KDF(Key Derivation Function)轮次更高,抗暴力破解更强(生成/加载会稍慢一点,通常可接受)

 • 生成后默认文件:

 • 私钥:~/.ssh/id_ed25519

 • 公钥:~/.ssh/id_ed25519.pub

强烈建议:给私钥设置 passphrase(密码短语)。这不是“SSH 登录密码”,而是保护你本机私钥的第二道锁。

3.2 Windows(两种常见方式)

 • Windows 10/11 内置 OpenSSH(推荐)

 2. 打开 PowerShell

 3. 执行:

ssh-keygen -t ed25519 -a 64 -C "your_email@example.com"

 4. 默认生成在:

 • C:\Users\<你>\.ssh\

 • PuTTY(历史遗留)

 • 用 PuTTYgen 生成密钥

 • 注意它的私钥格式(.ppk)与 OpenSSH 不同;需要时可导出 OpenSSH 格式


4. 把公钥装到服务器:三种方式

目标:让服务端的目标用户拥有你的公钥。

4.1 用 ssh-copy-id(最省事)

(前提:服务端允许密码登录一次,或你已有其他方式登录)

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

4.2 手动追加到 authorized_keys

在服务端(以目标用户身份):

mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat >> ~/.ssh/authorized_keys
# 把本地 id_ed25519.pub 的内容粘贴进来,然后 Ctrl+D 结束
chmod 600 ~/.ssh/authorized_keys

4.3 临时用密码登录后再配置(常见场景)

如果你现在只能密码登录:

 2. 先 ssh user@server 登录

 3. 按 4.2 配置 authorized_keys

 4. 验证密钥登录 OK 后,再去禁用密码登录(下一节)


5. 服务端安全基线:强制密钥登录、禁用密码、禁用 root

以下以 Linux 的 OpenSSH 服务端为例(服务端配置文件通常是 /etc/ssh/sshd_config)。

5.1 修改 sshd_config

用 root 或 sudo 编辑:

sudo nano /etc/ssh/sshd_config

建议配置(按需取用;不同发行版可能已有默认值):

# 禁止 root 直接登录(推荐)
PermitRootLogin no

# 禁用密码登录(核心)
PasswordAuthentication no
KbdInteractiveAuthentication no

# 明确启用公钥认证
PubkeyAuthentication yes

# 可选:只允许指定用户登录
# AllowUsers user1 user2

# 可选:禁止空密码
PermitEmptyPasswords no

# 可选:收紧认证尝试次数与超时
MaxAuthTries 3
LoginGraceTime 30

注意事项:

 • 有些系统使用 ChallengeResponseAuthentication 或 KbdInteractiveAuthentication,名字可能略有差异;以你系统实际配置项为准。

 • 如果你在云服务器上操作,建议 先开一个第二终端保持登录,避免配置错误导致把自己锁在门外。

5.2 配置生效:校验并重启 sshd

先检查配置是否正确:

sudo sshd -t

无输出通常表示 OK。然后重启服务(择其一):

sudo systemctl restart sshd

或:

sudo systemctl restart ssh

6. 客户端常用连接方式(含跳板/端口/别名)

6.1 基本连接

ssh user@server

指定端口:

ssh -p 2222 user@server

指定私钥:

ssh -i ~/.ssh/id_ed25519 user@server

6.2 用 ~/.ssh/config 做“别名”和“默认参数”(强烈推荐)

在客户端编辑 ~/.ssh/config(Windows 也有同样路径:C:\Users\<你>\.ssh\config):

Host myserver
	HostName example.com
	User user
	Port 22
	IdentityFile ~/.ssh/id_ed25519
	ServerAliveInterval 30
	ServerAliveCountMax 3

以后直接:

ssh myserver

6.3 通过跳板机(ProxyJump)

常见企业/家庭内网场景:

Host bastion
	HostName bastion.example.com
	User jumpuser
	IdentityFile ~/.ssh/id_ed25519

Host internal-1
	HostName 10.0.0.10
	User user
	ProxyJump bastion

连接:

ssh internal-1

7. SSH Agent 与密钥管理(macOS / Linux / Windows)

如果你的私钥设置了 passphrase,每次使用都输入会烦,SSH Agent 就是用来“帮你缓存解密后的私钥”。

7.1 Linux(常见)

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l

7.2 macOS(常见坑:钥匙串 / agent)

macOS 通常会自动管理一部分密钥;你也可以手动添加:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

并在 ~/.ssh/config 加:

Host *
	AddKeysToAgent yes
	UseKeychain yes
	IdentityFile ~/.ssh/id_ed25519

7.3 Windows

 • PowerShell:

 • OpenSSH Agent 服务可启用后自动管理

 • VS Code Remote / Git 等场景:

 • 优先统一使用系统 OpenSSH(避免多个 SSH 实现互相抢)


8. 常见排查:为什么密钥登录失败

8.1 客户端加 -v 看细节

ssh -v user@server
# 更详细:-vv 或 -vvv

重点看:

 • 客户端是否“找到并尝试了”你期望的私钥

 • 服务端是否拒绝了公钥(权限/格式/用户不匹配)

8.2 服务端权限是重灾区

服务端目标用户应满足:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

并且:

 • ~(家目录)权限不要过于宽松(例如某些系统要求 home 目录不可被 group/other 写)

 • authorized_keys 一行一个 key,不要多余换行或粘贴错误

8.3 服务端日志

不同系统日志位置不同,常见:

 • Debian/Ubuntu:/var/log/auth.log

 • CentOS/RHEL:/var/log/secure

 • systemd:

sudo journalctl -u ssh -e
# 或
sudo journalctl -u sshd -e

9. 进一步加固(可选,但很实用)

9.1 改端口不是“安全”本身,但能降噪

把 22 改为别的端口能明显减少扫描噪声,但不应替代密钥/防火墙等核心措施。

9.2 防火墙只允许可信来源

 • 家用:只允许自己的公网 IP / VPN 网段访问 SSH

 • 云服务器:安全组限制来源 IP

9.3 Fail2ban / sshguard

自动封禁频繁失败的 IP。

9.4 最小权限原则

 • 不要共享账号

 • 不要给所有人 root

 • 用 sudo 且记录审计


10. 快速清单(Checklist)