💡 学习指南:每次 git push 输密码?连服务器总被提示"Permission denied"?本章用 5 分钟带你搞懂 SSH 密钥认证的原理,以及如何一键免密登录 GitHub 和服务器。


0. 你一定遇到过这些场景

  • git push 时反复弹出密码输入框,烦不胜烦
  • SSH 连接服务器失败,不知道 id_rsaid_ed25519 是什么
  • 听说"公钥"和"私钥",但搞不清哪个给别人、哪个自己留

核心矛盾:密码不安全、又麻烦。SSH 密钥就是用来同时解决安全性和便利性的方案。


1. 密码 vs 密钥:为什么密钥更好?

👇 动手点点看:对比密码登录和密钥登录的区别

💡 一句话总结

密码登录 = 每次把密码发过去让对方核对(密码可能被截获);
密钥登录 = 证明"我有钥匙"但不用把钥匙给你看(私钥永不传输)。


2. 非对称加密:公钥和私钥

SSH 密钥基于非对称加密,一次生成两把钥匙:

私钥 (Private Key) 公钥 (Public Key)
保存位置 你的电脑 ~/.ssh/id_ed25519 服务器/GitHub
可以给别人吗 ❌ 绝不 ✅ 随便给
功能 签名(证明身份) 验签(验证身份)
类比 钥匙

常见密钥类型

类型 命令 推荐度 说明
Ed25519 ssh-keygen -t ed25519 ⭐⭐⭐ 最新最快最安全
RSA ssh-keygen -t rsa -b 4096 ⭐⭐ 兼容性好,但较慢
ECDSA ssh-keygen -t ecdsa 一般不推荐

3. 实战:生成并配置 SSH 密钥

3.1 生成密钥对

  ssh-keygen -t ed25519 -C "your@email.com"
  

执行后会提示:

  • 文件路径:直接回车用默认路径 ~/.ssh/id_ed25519
  • 密码短语:可以设置额外保护(也可留空)

3.2 把公钥添加到 GitHub

  # 1. 复制公钥内容
cat ~/.ssh/id_ed25519.pub | pbcopy  # macOS
cat ~/.ssh/id_ed25519.pub | xclip   # Linux

# 2. 打开 GitHub → Settings → SSH and GPG keys → New SSH key
# 3. 粘贴公钥,保存

# 4. 测试连接
ssh -T git@github.com
# 成功会看到: Hi username! You've been authenticated...
  

3.3 把公钥添加到服务器

  # 方式一:ssh-copy-id(推荐)
ssh-copy-id user@your-server

# 方式二:手动复制
cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
  

4. SSH Config:告别长命令

~/.ssh/config 中配置别名,一次配置终身受益:

  Host dev
  HostName 192.168.1.100
  User deploy
  IdentityFile ~/.ssh/id_ed25519

Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519
  

配置后的效果:

之前 之后
ssh -i ~/.ssh/id_ed25519 deploy@192.168.1.100 ssh dev
每次都要记 IP 和用户名 记一个别名就够

5. 常见问题排查

问题 原因 解决方案
Permission denied (publickey) 公钥没添加到服务器 ssh-copy-id user@server
WARNING: UNPROTECTED PRIVATE KEY FILE 私钥文件权限太宽 chmod 600 ~/.ssh/id_ed25519
Could not resolve hostname SSH Config 配置有误 检查 ~/.ssh/config 格式
GitHub 还是要密码 用的 HTTPS 而非 SSH 改用 git@github.com:user/repo.git

6. 总结

📚 核心要点
  1. 密钥 > 密码:私钥永不传输,比密码安全得多
  2. 推荐 Ed25519:最现代的密钥算法,速度快、安全性高
  3. 公钥随便给,私钥绝不泄露:记住这条铁律
  4. SSH Config:配一次别名,之后 ssh 别名 一键连接
  5. GitHub/GitLab:添加公钥后,git push/pull 再也不需要输密码

下一步学习

Last updated 26 Apr 2026, 03:21 +0800 . history