跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Git签名验证
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Git签名验证 = '''Git签名验证'''是Git版本控制系统中用于确保提交和标签的真实性与完整性的安全机制。通过使用加密签名(如GPG或SSH密钥),开发者可以证明其身份,并防止恶意篡改代码历史。本指南将详细介绍签名验证的工作原理、配置方法及实际应用。 == 概述 == 在分布式版本控制系统中,任何人都可以修改本地仓库并伪造提交者信息。Git签名验证通过以下方式解决此问题: * '''提交签名''':使用私钥对提交内容生成数字签名 * '''标签签名''':对版本标签附加密码学签名 * '''验证机制''':其他用户可用公钥验证签名的真实性 签名过程基于非对称加密原理: <math>签名 = Sign(私钥, 提交内容)</math> <math>验证 = Verify(公钥, 签名, 提交内容)</math> == 配置签名验证 == === 1. 生成GPG密钥 === 首先需要安装GPG工具并生成密钥对: <syntaxhighlight lang="bash"> # 生成新密钥(推荐RSA 4096位) gpg --full-generate-key # 列出现有密钥 gpg --list-secret-keys --keyid-format LONG </syntaxhighlight> 输出示例: <pre> sec rsa4096/3AA5C34371567BD2 2023-01-01 [SC] Key fingerprint = 4EE6 8E2A 3AA5 C343 7156 7BD2 1234 5678 9012 3456 uid [ultimate] Alice Developer <alice@example.com> </pre> === 2. 配置Git使用GPG === 将密钥ID告知Git: <syntaxhighlight lang="bash"> git config --global user.signingkey 3AA5C34371567BD2 git config --global commit.gpgsign true # 自动签名所有提交 </syntaxhighlight> == 签名操作 == === 签名提交 === 创建签名提交(若未设置自动签名): <syntaxhighlight lang="bash"> git commit -S -m "Signed commit message" </syntaxhighlight> 输出会显示签名信息: <pre> [main 1a2b3c4] Signed commit 1 file changed, 1 insertion(+) gpg: Signature made Tue Jan 1 12:00:00 2023 UTC gpg: using RSA key 3AA5C34371567BD2 gpg: Good signature from "Alice Developer <alice@example.com>" </pre> === 签名标签 === 创建签名标签: <syntaxhighlight lang="bash"> git tag -s v1.0 -m "Version 1.0 release" </syntaxhighlight> == 验证签名 == === 验证单个提交 === <syntaxhighlight lang="bash"> git verify-commit HEAD </syntaxhighlight> 成功验证输出: <pre> gpg: Signature made Tue Jan 1 12:00:00 2023 UTC gpg: using RSA key 3AA5C34371567BD2 gpg: Good signature from "Alice Developer <alice@example.com>" </pre> === 验证标签 === <syntaxhighlight lang="bash"> git tag -v v1.0 </syntaxhighlight> === 查看日志中的签名 === 添加<code>--show-signature</code>选项: <syntaxhighlight lang="bash"> git log --show-signature -1 </syntaxhighlight> == 签名验证流程 == <mermaid> sequenceDiagram participant Developer participant Git participant GPG participant Repository Developer->>Git: git commit -S Git->>GPG: 请求签名(提交内容) GPG->>Developer: 要求输入密码 Developer->>GPG: 提供密码 GPG->>Git: 返回签名 Git->>Repository: 存储签名+提交 Repository->>OtherDev: 推送代码 OtherDev->>GPG: 请求验证签名 GPG->>OtherDev: 返回验证结果 </mermaid> == 实际案例 == '''案例:Linux内核开发''' Linux项目要求所有核心提交必须使用签名验证: 1. 开发者向邮件列表发送补丁时附带签名 2. 维护者通过<code>git am --verify-signature</code>验证补丁 3. 只有通过验证的补丁才会被合并 典型工作流: <syntaxhighlight lang="bash"> # 生成签名补丁 git format-patch -1 --stdout | gpg --clearsign > patch.txt # 验证签名补丁 git am --verify-signature patch.txt </syntaxhighlight> == 常见问题 == '''Q: 如何解决"gpg failed to sign the data"错误?''' A: 确保: * GPG代理正在运行(<code>gpgconf --launch gpg-agent</code>) * Git配置了正确的GPG程序路径(<code>git config --global gpg.program $(which gpg)</code>) '''Q: 团队如何共享公钥?''' A: 推荐方法: 1. 开发者上传公钥到密钥服务器: <syntaxhighlight lang="bash"> gpg --send-keys KEYID </syntaxhighlight> 2. 其他成员导入密钥: <syntaxhighlight lang="bash"> gpg --recv-keys KEYID </syntaxhighlight> == 高级主题 == === 使用SSH密钥签名 === Git 2.34+支持SSH密钥签名: <syntaxhighlight lang="bash"> git config --global gpg.format ssh git config --global user.signingkey ~/.ssh/id_ed25519.pub </syntaxhighlight> === 签名策略配置 === 通过<code>git config</code>设置不同级别的签名要求: <syntaxhighlight lang="bash"> # 要求所有推送的提交必须签名 git config --global push.gpgsign true # 要求标签必须签名 git config --global tag.gpgsign true </syntaxhighlight> == 安全注意事项 == * 私钥必须妥善保管(建议使用硬件安全模块) * 定期轮换密钥(建议每年更新) * 撤销已泄露的密钥: <syntaxhighlight lang="bash"> gpg --gen-revoke KEYID > revoke.asc gpg --import revoke.asc gpg --keyserver hkp://keyserver.ubuntu.com --send-keys KEYID </syntaxhighlight> [[Category:Git安全实践]] [[Category:版本控制]] [[Category:集成部署]] [[Category:Git]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)