logo Fonnpo

联系我
2026年5月30日 2 分鐘閱讀 Fonnpo

SSH Key 生成全指南

SSH Key 是通过非对称加密实现免密登录和身份验证的方式。本文覆盖算法选择、基础生成、多平台多账号管理、ssh-agent 配置、服务器部署、Windows 环境以及常见问题排查,各种情况一文搞定。

#DevOps#SSH#Git

SSH Key 是通过非对称加密实现免密登录和身份验证的方式,比密码更安全,也更方便。本文覆盖日常开发中最常见的几种情况。

算法选择

生成 SSH Key 之前,先确定用哪种算法。

算法推荐程度说明
Ed25519✅ 首选现代椭圆曲线算法,密钥短、速度快、安全性强
RSA 4096✅ 兼容用兼容性最好,老系统必备,密钥较长
ECDSA⚠️ 可用比 RSA 短,但某些实现有隐患
RSA 2048❌ 不推荐已被认为强度不足
DSA❌ 不推荐已废弃

结论:新环境优先用 Ed25519,需要兼容老系统时用 RSA 4096。

基础:生成第一个 SSH Key

Ed25519(推荐)

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

    

RSA 4096(兼容用)

Bash
        ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

    

执行后会提示:

Properties
        Enter file in which to save the key (/Users/you/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

    
  • 文件路径:直接回车用默认路径即可
  • Passphrase:建议设置,相当于给私钥加一层密码保护

生成成功后:

  • ~/.ssh/id_ed25519 — 私钥,不要泄露、不要上传
  • ~/.ssh/id_ed25519.pub — 公钥,粘贴到各平台

查看公钥内容

Bash
        cat ~/.ssh/id_ed25519.pub

    

输出类似:

Properties
        ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your_email@example.com

    

把这一整行复制,粘贴到 GitHub / GitLab / 服务器的 authorized_keys 即可。

情况一:多平台多账号(最常见)

工作中很常见同时用 GitHub 个人账号、GitHub 公司账号、GitLab、内网服务器,每个都需要独立密钥。

第一步:生成多个密钥,分别命名

Bash
        # 个人 GitHub
ssh-keygen -t ed25519 -C "me@personal.com" -f ~/.ssh/id_ed25519_github_personal

# 公司 GitHub
ssh-keygen -t ed25519 -C "me@work.com" -f ~/.ssh/id_ed25519_github_work

# GitLab
ssh-keygen -t ed25519 -C "me@work.com" -f ~/.ssh/id_ed25519_gitlab

# 内网服务器
ssh-keygen -t ed25519 -C "server" -f ~/.ssh/id_ed25519_server

    

第二步:配置 ~/.ssh/config

~/.ssh/config
        # 个人 GitHub
Host github-personal
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github_personal

# 公司 GitHub
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github_work

# GitLab
Host gitlab.com
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/id_ed25519_gitlab

# 内网服务器
Host dev-server
    HostName 192.168.1.100
    User ubuntu
    Port 22
    IdentityFile ~/.ssh/id_ed25519_server

    

第三步:使用别名操作

Bash
        # clone 个人仓库(用 Host 别名替换 github.com)
git clone git@github-personal:username/repo.git

# clone 公司仓库
git clone git@github-work:company/repo.git

# 直接 SSH 登录服务器
ssh dev-server

    

情况二:添加到 ssh-agent

如果私钥设置了 passphrase,每次使用都要输密码。ssh-agent 可以在会话期间记住密码。

Bash
        # 启动 agent(通常已自动启动)
eval "$(ssh-agent -s)"

# 将私钥添加到 agent
ssh-add ~/.ssh/id_ed25519

# 查看已加载的 key
ssh-add -l

    

macOS 持久化(将 key 保存到 Keychain,重启后不用重新 add):

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

    

~/.ssh/config 中加上这两行,让 macOS 自动使用 Keychain:

Properties
        Host *
    AddKeysToAgent yes
    UseKeychain yes

    

情况三:将公钥部署到服务器

方式一:ssh-copy-id(最简单)

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

    

方式二:手动追加

Bash
        cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

    

方式三:直接编辑服务器文件

登录服务器后:

Bash
        mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

    

权限很重要,设错了 SSH 会拒绝:

路径权限
~/.ssh/700
~/.ssh/authorized_keys600
私钥文件600
公钥文件644

情况四:Windows 环境

Windows 有几种情况需要单独处理。

Git Bash / WSL

流程和 macOS/Linux 基本一致,~/.ssh/ 路径同样有效。

PowerShell(OpenSSH 内置)

Windows 10 1809+ 已内置 OpenSSH:

Bash
        # 生成密钥
ssh-keygen -t ed25519 -C "your_email@example.com"

# 密钥默认存放在
# C:\Users\你的用户名\.ssh\id_ed25519

    

启动 ssh-agent 服务

Bash
        # 以管理员身份运行
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent

# 添加密钥
ssh-add $env:USERPROFILE\.ssh\id_ed25519

    

情况五:测试连接

配置完成后验证是否生效:

Bash
        # 测试 GitHub
ssh -T git@github.com
# 输出:Hi username! You've successfully authenticated...

# 测试使用别名
ssh -T git@github-personal

# 测试服务器(-v 显示详细日志,排查问题用)
ssh -v user@server_ip

    

情况六:更换或吊销密钥

生成新密钥后,需要:

  1. 把新公钥添加到所有平台 / 服务器
  2. 从平台 / 服务器删除旧公钥
  3. 本地删除旧私钥文件(可选)
Bash
        # 从 agent 移除旧 key
ssh-add -d ~/.ssh/old_key

# 删除旧密钥文件
rm ~/.ssh/old_key ~/.ssh/old_key.pub

    

服务器上删除旧公钥

Bash
        # 编辑 authorized_keys,删掉对应那一行即可
nano ~/.ssh/authorized_keys

    

常见问题

Permission denied (publickey)

  • 检查公钥是否已添加到目标平台
  • 检查 ~/.ssh/authorized_keys 权限是否为 600
  • ssh -v 查看详细握手日志

每次都要输 passphrase

  • 把 key 加入 ssh-agent:ssh-add ~/.ssh/id_ed25519
  • macOS 用 --apple-use-keychain 持久化

Git clone 用的是哪个 key

Bash
        # 查看当前用的是哪个身份
ssh -T git@github.com

# 指定 key 临时测试
ssh -i ~/.ssh/id_ed25519_github_personal -T git@github.com

    
Fonnpo