SSH 与密钥认证
💡 学习指南:每次
git push输密码?连服务器总被提示"Permission denied"?本章用 5 分钟带你搞懂 SSH 密钥认证的原理,以及如何一键免密登录 GitHub 和服务器。
0. 你一定遇到过这些场景
git push时反复弹出密码输入框,烦不胜烦- SSH 连接服务器失败,不知道
id_rsa和id_ed25519是什么 - 听说"公钥"和"私钥",但搞不清哪个给别人、哪个自己留
核心矛盾:密码不安全、又麻烦。SSH 密钥就是用来同时解决安全性和便利性的方案。
1. 密码 vs 密钥:为什么密钥更好?
👇 动手点点看:对比密码登录和密钥登录的区别
SSH 密钥认证:你的数字身份证对称加密 vs 非对称加密 · 密钥对生成 · 认证流程
密码登录
1输入用户名和密码
2密码通过网络发送到服务器
3服务器比对密码是否正确
4每次都要输密码
密码在网络上传输,可能被截获
密钥登录
1事先把公钥放到服务器
2连接时发送身份标识(不发私钥)
3服务器用公钥出"数学题"
4你的私钥在本地"答题",只发答案
私钥永远不离开你的电脑
核心思想:SSH 密钥登录比密码更安全,因为私钥从不在网络上传输,无法被中间人窃取。
💡 一句话总结
密码登录 = 每次把密码发过去让对方核对(密码可能被截获);
密钥登录 = 证明"我有钥匙"但不用把钥匙给你看(私钥永不传输)。
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 生成密钥对
bash
ssh-keygen -t ed25519 -C "your@email.com"执行后会提示:
- 文件路径:直接回车用默认路径
~/.ssh/id_ed25519 - 密码短语:可以设置额外保护(也可留空)
3.2 把公钥添加到 GitHub
bash
# 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 把公钥添加到服务器
bash
# 方式一: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. 总结
📚 核心要点
- 密钥 > 密码:私钥永不传输,比密码安全得多
- 推荐 Ed25519:最现代的密钥算法,速度快、安全性高
- 公钥随便给,私钥绝不泄露:记住这条铁律
- SSH Config:配一次别名,之后
ssh 别名一键连接 - GitHub/GitLab:添加公钥后,
git push/pull再也不需要输密码
下一步学习:
- 端口与 localhost - 理解网络连接的基础
- 环境变量与 PATH - 理解系统配置
