SSH 密钥配置完全指南


1. 生成 SSH 密钥

在本地(Windows PowerShell / Linux / Mac)执行

# 生成 Ed25519 类型密钥(推荐,更安全更快)
# Linux / Mac / Git Bash / WSL
ssh-keygen -t ed25519 -C "your-email@example.com" -f ~/.ssh/your-key-name

# Windows PowerShell
ssh-keygen -t ed25519 -C "your-email@example.com" -f $env:USERPROFILE\.ssh\your-key-name

参数说明

参数 作用 示例
-t ed25519 密钥类型 Ed25519(推荐)
-C 注释(方便识别用途) "deploy-server-key"
-f 保存路径和文件名 ~/.ssh/deploy-key

交互提示

Enter passphrase (empty for no passphrase): [直接回车,不设密码]
Enter same passphrase again: [直接回车]

生成的文件

文件 说明 谁需要
your-key-name 私钥 自己保管,绝对不能上传
your-key-name.pub 公钥 添加到服务器

查看公钥内容(复制用)

cat ~/.ssh/your-key-name.pub # Linux、Mac、Git Bash、WSL
# 或
type ~/.ssh/your-key-name.pub # Windows (CMD / PowerShell)

2. 配置免密登录

方法一:直接用 root 用户

1. 查看公钥内容(如果还没复制)

# Linux / Mac / Git Bash / WSL
cat ~/.ssh/root-key.pub
# 或
# Windows (CMD / PowerShell)
type $env:USERPROFILE\.ssh\root-key.pub

2. 登录 root 用户

ssh root@192.168.1.1
# 输入 root 密码

3. 配置公钥

# 创建 .ssh 目录(如果不存在)
mkdir -p ~/.ssh

# 添加公钥
echo "你的公钥内容" >> ~/.ssh/authorized_keys

# 设置权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

4. 退出并测试

exit
ssh -i ~/.ssh/root-key root@192.168.1.1

方法二:直接用 deploy 用户

1. 查看公钥内容(如果还没复制)

# Linux / Mac / Git Bash / WSL
cat ~/.ssh/deploy-key.pub
# 或
# Windows (CMD / PowerShell)
type $env:USERPROFILE\.ssh\deploy-key.pub

2. 登录 deploy 用户(如果知道密码)


# 创建 deploy 用户(如果没有 deploy 用户)
ssh root@192.168.1.1
useradd -m -s /bin/bash deploy
passwd deploy # 可选:给 deploy 设置密码


ssh deploy@192.168.1.1
# 输入 deploy 密码

如果不知道 deploy 密码,可使用 root 用户配置公钥。

3. 为 deploy 用户配置公钥

# 创建 .ssh 目录(如果不存在)
mkdir -p /home/deploy/.ssh

# 添加公钥
echo "你的公钥内容" >> /home/deploy/.ssh/authorized_keys

# 设置权限
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh

4. 退出并测试

exit
ssh -i ~/.ssh/deploy-key deploy@192.168.1.1

方法三:使用 ssh-copy-id(Linux/Mac/Git Bash)

# Linux / Mac / Git Bash / WSL
ssh-copy-id -i ~/.ssh/your-key-name.pub deploy@192.168.1.1

# Windows PowerShell 下使用 ssh-copy-id 替代方案(因为 Windows 没有这个命令)
type $env:USERPROFILE\.ssh\your-key-name.pub | ssh deploy@192.168.1.1 "cat >> ~/.ssh/authorized_keys"

我应该用哪个用户?

你的情况 推荐方案
知道 root 密码,不知道 deploy 密码 直接用 root 用户(方法一)
知道 deploy 密码 deploy 用户(方法二)
想要更安全,避免用 root deploy 用户(方法二)
想要最简单的部署脚本 root 用户(避免权限问题)

一键脚本把公钥复制到 deploy 用户(Linux/Mac/Git Bash)

在本地执行,一行搞定:

# Linux / Mac / Git Bash / WSL
cat ~/.ssh/deploy-key.pub | ssh root@192.168.1.1 "mkdir -p /home/deploy/.ssh && cat >> /home/deploy/.ssh/authorized_keys && chmod 700 /home/deploy/.ssh && chmod 600 /home/deploy/.ssh/authorized_keys && chown -R deploy:deploy /home/deploy/.ssh"

# Windows PowerShell
type $env:USERPROFILE\.ssh\deploy-key.pub | ssh root@192.168.1.1 "mkdir -p /home/deploy/.ssh && cat >> /home/deploy/.ssh/authorized_keys && chmod 700 /home/deploy/.ssh && chmod 600 /home/deploy/.ssh/authorized_keys && chown -R deploy:deploy /home/deploy/.ssh"

输入 root 密码后自动完成。

权限说明(为什么需要这些命令)

命令 为什么
chmod 700 ~/.ssh 只有自己能进入 .ssh 目录
chmod 600 authorized_keys 只有自己能修改公钥文件
chown -R deploy:deploy 文件必须属于 deploy 用户

不设置正确权限,SSH 会拒绝免密登录。

服务器上的正确权限

路径 权限 命令 说明
/home/用户名 755700 chmod 755 /home/deploy 家目录
/home/用户名/.ssh 700 chmod 700 ~/.ssh 只有所有者能进入
/home/用户名/.ssh/authorized_keys 600 chmod 600 ~/.ssh/authorized_keys 只有所有者能读写
所有者 必须是登录用户 chown -R deploy:deploy ~/.ssh 不能是 root

一键修复权限(用 root 执行)

# 修复 deploy 用户的 SSH 权限
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys

查看当前权限

# 查看 .ssh 目录
ls -ld /home/deploy/.ssh

# 查看 authorized_keys 文件
ls -l /home/deploy/.ssh/authorized_keys

正确输出示例

drwx------ 2 deploy deploy 4096 Apr 12 00:20 /home/deploy/.ssh
-rw------- 1 deploy deploy 113 Apr 12 00:18 /home/deploy/.ssh/authorized_keys

测试验证

测试免密登录

# Linux / Mac / Git Bash / WSL
ssh -i ~/.ssh/your-key-name deploy@192.168.1.1

# Windows PowerShell
ssh -i $env:USERPROFILE\.ssh\your-key-name deploy@192.168.1.1

如果成功,你会看到

[deploy@root ~]$

如果失败,要求输入密码

说明配置有问题,检查权限和公钥内容。

详细调试模式(查看具体错误)

# Linux / Mac / Git Bash / WSL
ssh -vvv -i ~/.ssh/your-key-name deploy@192.168.1.1

# Windows PowerShell
ssh -vvv -i $env:USERPROFILE\.ssh\your-key-name deploy@192.168.1.1

快速测试命令

# Linux / Mac / Git Bash / WSL
ssh -i ~/.ssh/deploy-key deploy@192.168.1.1 "echo 登录成功"

# Windows PowerShell
ssh -i $env:USERPROFILE\.ssh\deploy-key deploy@192.168.1.1 "echo 登录成功"

输出 登录成功 就代表配置好了。

常见问题排查

问题 可能原因 解决方法
仍然要求密码 公钥没加对 检查 authorized_keys 内容
仍然要求密码 权限不对 执行权限修复命令
仍然要求密码 所有者是 root chown -R deploy:deploy ~/.ssh
Permission denied (publickey) SSH 配置禁用了公钥登录 检查 /etc/ssh/sshd_configPubkeyAuthentication yes
bad ownership or modes 权限太宽松 执行权限修复命令
找不到密钥文件 路径错误 使用绝对路径 -i C:\Users\用户名\.ssh\密钥名
明明有密钥却没用上 ~/.ssh/configIdentityFile 写错 检查路径或删除配置让 SSH 自动尝试
密钥权限太开放报错 Windows 复制过来的权限不对 chmod 600 ~/.ssh/your-key

检查服务器 SSH 配置

# 登录服务器后执行
sudo grep -E "PubkeyAuthentication|AuthorizedKeysFile|PasswordAuthentication" /etc/ssh/sshd_config

应该看到:

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

如果修改了配置,重启 SSH:

sudo systemctl restart sshd

安全建议

  1. 私钥绝不外传:不要上传到 Git 仓库,不要分享给他人
  2. 使用不同密钥:不同用途使用不同密钥(如 github-keydeploy-key
  3. 禁用密码登录(可选,更安全):在 /etc/ssh/sshd_config 中设置 PasswordAuthentication no
  4. 定期轮换密钥:定期生成新密钥,删除旧公钥
  5. 使用 Ed25519:比 RSA 更安全、更快

快速命令速查表

操作 命令
生成密钥 ssh-keygen -t ed25519 -C "注释" -f ~/.ssh/密钥名
查看公钥 cat ~/.ssh/密钥名.pub
手动添加公钥(有密码) echo "公钥" >> ~/.ssh/authorized_keys
用 root 为 deploy 添加 echo "公钥" >> /home/deploy/.ssh/authorized_keys
修复权限 chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
修复所有者 chown -R deploy:deploy /home/deploy/.ssh
测试登录 ssh -i ~/.ssh/密钥名 deploy@服务器IP
调试模式 ssh -vvv -i ~/.ssh/密钥名 deploy@服务器IP

Windows PowerShell 等效命令:

操作 命令
生成密钥 ssh-keygen -t ed25519 -C "注释" -f $env:USERPROFILE\.ssh\密钥名
查看公钥 type $env:USERPROFILE\.ssh\密钥名.pub
测试登录 ssh -i $env:USERPROFILE\.ssh\密钥名 deploy@服务器IP
调试模式 ssh -vvv -i $env:USERPROFILE\.ssh\密钥名 deploy@服务器IP

8. 扩展场景

GitHub/GitLab 配置对比

很多人配置 SSH 是为了 Git,以下是不同平台的配置对比:

用途 服务器地址 配置位置
GitHub github.com 个人设置 → SSH and GPG keys
GitLab gitlab.com 偏好设置 → SSH Keys
自己的服务器 192.168.1.1 ~/.ssh/authorized_keys

文章作者: 弈心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 弈心 !
评论
  目录