
Git、GitHub 与 SSH 密钥从原理到实践一、故障排查解决Permission denied (publickey)错误错误原因电脑与 GitHub 之间的 SSH 认证失败通常是因为 SSH 密钥未配置或未正确关联。诊断步骤检查现有密钥ls -al ~/.ssh查看是否存在id_ed25519/id_ed25519.pub等文件。检查远程地址git remote -v确认使用的是 SSH 协议gitgithub.com:...而不是 HTTPS 协议。测试连通性ssh -T gitgithub.com这是验证一切的黄金命令。成功显示Hi 用户名! Youve successfully authenticated...。失败显示Permission denied (publickey)。修复方案核心三步生成密钥对如果没有ssh-keygen -t ed25519 -C your_emailexample.com。添加公钥到 GitHub复制~/.ssh/id_ed25519.pub的内容粘贴到 GitHub 的Settings - SSH and GPG keys中。加载私钥到 ssh-agenteval$(ssh-agent-s)# 启动 ssh-agentssh-add ~/.ssh/id_ed25519# 加载私钥WSL 用户注意每次重启 WSL 窗口或电脑都需要重新执行加载命令。建议写入~/.bashrc实现自动加载。# 添加到 ~/.bashrc 末尾实现 WSL 自动加载密钥if[-z$SSH_AUTH_SOCK];theneval$(ssh-agent-s)ssh-add ~/.ssh/id_ed255192/dev/nullfi二、核心概念非对称加密SSH 密钥对一对文件两种职责文件性质作用存放位置id_ed25519(私钥)绝对机密永不外传数字签名在认证时对挑战信息进行签名证明“我是我”。仅存于本地~/.ssh/目录。id_ed25519.pub(公钥)可公开可随意分享验签配锁像一把挂锁放在服务器上用来验证持有对应私钥的人发来的签名。上传到 GitHub 等服务器账户中。如何验证本地公钥与 GitHub 上的公钥是否一致不要用肉眼对比长文本应对比“指纹”# 本地生成公钥指纹ssh-keygen-l-f~/.ssh/id_ed25519.pub然后将输出的SHA256:...字符串与 GitHub 密钥详情页的 “Fingerprint” 字段进行比对。指纹匹配即证明密钥完全一致。三、深入原理Ed25519 数字签名与 SSH 认证ed25519 是一种数字签名算法核心是“签名”和“验签”而不是“加密”和“解密”。SSH 认证流程公钥认证方式客户端声明电脑向 GitHub 发送认证请求并附上公钥。服务器确认GitHub 在数据库中查找该公钥若存在则回复许可。客户端签名客户端在内存中拼接一个包含会话 ID、用户名、服务名等信息的消息体M。使用本地的id_ed25519(私钥)对M进行 EdDSA 运算生成一个 64 字节的签名S。将签名S发送给 GitHub。服务器验签GitHub 在本地用相同信息重组消息体M。使用数据库中存储的id_ed25519.pub(公钥)对签名S执行验签算法。若验算通过证明该签名必定由对应的私钥生成认证成功。关键安全特性私钥不出网整个认证过程私钥始终留在本地内存不会通过网络传输。防重放攻击签名绑定了本次连接唯一的“会话 ID”截获的数据包无法用于下一次连接。四、GitHub 协作SSH 与 GPG 密钥的区别对比维度SSH 密钥GPG 密钥比喻门禁卡证明你有权进入大楼仓库。私人印章证明文件代码提交是你亲手签署的。核心用途安全连接加密通信替代密码进行身份验证。数字签名与加密为数据内容提供完整性和原作者身份证明。GitHub 作用执行git push/pull等操作时的权限验证。为 Commit / Tag 签名使其在 GitHub 上显示 “Verified” 绿色徽章。验证对象主机/用户的访问权限。数据内容的真实性与完整性。是否必须必须。push/pull代码的基础。可选。用于提升项目专业度和可信度。简单来说拥有SSH 密钥你就能向仓库推送代码。拥有GPG 密钥你推送的代码提交记录旁就会有一个绿色的“已验证”标识证明这个提交确实是你本人所做的且未被篡改。 快捷操作速查卡目标命令生成密钥ssh-keygen -t ed25519 -C 你的邮箱example.com查看公钥cat ~/.ssh/id_ed25519.pub启动代理并加载私钥eval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519测试 GitHub 连接ssh -T gitgithub.com查看远程仓库地址git remote -v将 HTTPS 远程地址改为 SSHgit remote set-url origin gitgithub.com:用户名/仓库名.git获取公钥指纹ssh-keygen -l -f ~/.ssh/id_ed25519.pub