在SSH协议中,公钥和私钥是成对存在的非对称加密密钥,其核心区别在于功能角色保密性。以下从原理到实践为你详细解读:


一、公钥与私钥的区别

  1. 功能差异

    • 公钥:公开共享,用于加密数据验证数字签名。例如,GitHub存储你的公钥后,任何用该公钥加密的数据只有你的私钥能解密。
    • 私钥:严格保密,用于解密数据生成数字签名。私钥持有者才能证明身份(如向GitHub提交代码时的认证)。
  2. 保密性要求

    • 公钥可随意分发(如上传到GitHub账户的SSH设置页面)。
    • 私钥必须本地存储且加密保护(建议设置passphrase),泄露将导致身份被冒用。
  3. 数学关联性
    两者由算法(如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

  1. 复制公钥内容:
    cat ~/.ssh/id_ed25519.pub
  2. 登录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输出日志定位问题。