在SSH协议中,公钥和私钥是成对存在的非对称加密密钥,其核心区别在于功能角色和保密性。以下从原理到实践为你详细解读:
一、公钥与私钥的区别
-
功能差异
- 公钥:公开共享,用于加密数据和验证数字签名。例如,GitHub存储你的公钥后,任何用该公钥加密的数据只有你的私钥能解密。
- 私钥:严格保密,用于解密数据和生成数字签名。私钥持有者才能证明身份(如向GitHub提交代码时的认证)。
-
保密性要求
- 公钥可随意分发(如上传到GitHub账户的SSH设置页面)。
- 私钥必须本地存储且加密保护(建议设置passphrase),泄露将导致身份被冒用。
-
数学关联性
两者由算法(如RSA、Ed25519)生成,通过数学关系绑定。公钥加密的内容只能用对应私钥解密,反之亦然。
二、生成SSH密钥对的步骤
1. 生成密钥对(本地操作)
ssh-keygen -t ed25519 -C "your_email@example.com"- 参数说明:
-t ed25519:推荐使用更安全的Ed25519算法(也可选RSA,如-t rsa -b 4096)。-C:注释信息,通常填写邮箱用于标识密钥用途。
- 交互流程:
- 按回车选择默认存储路径(
~/.ssh/id_ed25519和~/.ssh/id_ed25519.pub)。 - 设置passphrase(可选但建议,防止私钥泄露后被滥用)。
- 按回车选择默认存储路径(
2. 密钥文件说明
- 私钥:
~/.ssh/id_ed25519
切勿分享!文件权限需设为600(仅用户可读写)。 - 公钥:
~/.ssh/id_ed25519.pub
内容以ssh-ed25519开头,需复制到GitHub的SSH设置页面。
3. 将公钥添加到GitHub
- 复制公钥内容:
cat ~/.ssh/id_ed25519.pub - 登录GitHub → Settings → SSH and GPG keys → 点击“New SSH key”,粘贴公钥内容。
三、常见问题排查
- 认证失败:检查公钥是否完整粘贴到GitHub,或通过
ssh -T git@github.com测试连接。 - 权限问题:确保
.ssh目录权限为700,私钥文件权限为600。 - 多密钥管理:可通过
~/.ssh/config文件为不同服务指定密钥(示例):Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github
总结
公钥与私钥通过非对称加密实现安全通信,生成时需注意算法选择和权限控制。若GitHub推送失败,建议优先检查公钥配置和SSH连接测试。如需更详细的SSH调试步骤,可参考GitHub官方文档或通过ssh -v输出日志定位问题。