Git:使用GPG签名Commit

简介: GPG从诞生开始,目的就是为了加密而存在。到如今的 git,用 GPG 来签名 commit ,可以保证我们提交不被篡改(当然密钥暴露就另当别论了!)

前言


GPG从诞生开始,目的就是为了加密而存在。到如今的 git,用 GPG 来签名 commit ,

可以保证我们提交不被篡改(当然密钥暴露就另当别论了!)

效果图



GPG概念及安装


官方中文文档


这里很好的说明了GPG 运行原理和使用姿势

GPG官方下载


核心是命令行,也有对应的 GUI 客户端,看自己喜欢了。

简化版姿势


假设你已经知道 GPG 是个什么东西,这里只说明在 Mac下如何快速生成公钥和密钥。

安装


我用的是 brew 包管理,可以理解为类似 yumapt-get 这类的东西。


brew install gpg gpg2 
# 安装后就可以直接输出 gpg 的帮助信息了
gpg --help
gpg (GnuPG) 2.2.17
libgcrypt 1.8.5
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: /Users/linqunhe/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
Syntax: gpg [options] [files]
Sign, check, encrypt or decrypt
Default operation depends on the input data
Commands:
 -s, --sign                  make a signature
     --clear-sign            make a clear text signature
 -b, --detach-sign           make a detached signature
 -e, --encrypt               encrypt data
 -c, --symmetric             encryption only with symmetric cipher
 -d, --decrypt               decrypt data (default)
     --verify                verify a signature
 -k, --list-keys             list keys
     --list-signatures       list keys and signatures
     --check-signatures      list and check key signatures
     --fingerprint           list keys and fingerprints
 -K, --list-secret-keys      list secret keys
     --generate-key          generate a new key pair
     --quick-generate-key    quickly generate a new key pair
     --quick-add-uid         quickly add a new user-id
     --quick-revoke-uid      quickly revoke a user-id
     --quick-set-expire      quickly set a new expiration date
     --full-generate-key     full featured key pair generation
     --generate-revocation   generate a revocation certificate
     --delete-keys           remove keys from the public keyring
     --delete-secret-keys    remove keys from the secret keyring
     --quick-sign-key        quickly sign a key
     --quick-lsign-key       quickly sign a key locally
     --sign-key              sign a key
     --lsign-key             sign a key locally
     --edit-key              sign or edit a key
     --change-passphrase     change a passphrase
     --export                export keys
     --send-keys             export keys to a keyserver
     --receive-keys          import keys from a keyserver
     --search-keys           search for keys on a keyserver
     --refresh-keys          update all keys from a keyserver
     --import                import/merge keys
     --card-status           print the card status
     --edit-card             change data on a card
     --change-pin            change a card's PIN
     --update-trustdb        update the trust database
     --print-md              print message digests
     --server                run in server mode
     --tofu-policy VALUE     set the TOFU policy for a key
Options:
 -a, --armor                 create ascii armored output
 -r, --recipient USER-ID     encrypt for USER-ID
 -u, --local-user USER-ID    use USER-ID to sign or decrypt
 -z N                        set compress level to N (0 disables)
     --textmode              use canonical text mode
 -o, --output FILE           write output to FILE
 -v, --verbose               verbose
 -n, --dry-run               do not make any changes
 -i, --interactive           prompt before overwriting
     --openpgp               use strict OpenPGP behavior
(See the man page for a complete listing of all commands and options)
Examples:
 -se -r Bob [file]          sign and encrypt for user Bob
 --clear-sign [file]        make a clear text signature
 --detach-sign [file]       make a detached signature
 --list-keys [names]        show keys
 --fingerprint [names]      show fingerprints
Please report bugs to <https://bugs.gnupg.org>.


生成私钥公钥

命令行有两种生成的方式


  • gpg --full-generate-key


可以很详细的针对每一项输入一些信息或者描述,一步一步的往下面引导,包括加密的方法等等



  • gpg --generate-key


简化版生成,主要输入用户名和邮箱以及密码即可(最好设置),我用的就是这个


查看公钥密钥


  • gpg -k :可以看到所有公钥的概要信息,等同于 gpg --list-keys



  • gpg -K : 可以看到所有私钥的概要信息,等同于 gpg --list-secret-keys



对外使用


若是要对外网使用,一般都需要把公钥发送到的 钥匙管理局 , 可以理解为 CA 的中间管理机构


gpg --send-key F29D95D5FC2F0XXXXX # XXXXX 是我真实部分的替换
# out: gpg: sending key 4F8D4XXXX7B1F8 to hkps://keys.openpgp.org

Git提交时自动签名


GPG 签名不是所有 GIT 服务商都提供这个支持,当前GithubGitLab是支持的,

国内的Coding码云这类暂时还没有提供对应的支持。


我们公司是部署的Gitlab Enterprise ,所以是可用的。

输出公钥的 ASCII 文本


gpg -a --export F29D95D5FC2F05FE803AXXXXX  # XXX是我替换了我本地真实的


在支持的 Git 服务设置


一般都是个人设置里面,不管 Github还是 Gitlab , 如Gitlab设置。


用户->设置->GPG密钥



配置及测试提交


# 此处的 signingKey跟着的是你的 GPG 私钥,可以避免每次都手动输入
git config --global user.signingkey <gpg-key-id>
# 提交是否强制 GPG,带上--global 是作用全局,局部的去除--global
git config --global commit.gpgsign true
# 测试提交,只在 commit 的时侯带上-S 参数即可,例如
git commit -m "Test GPG" -S


更多详情请看此处:自定义 Git - 配置 Git

目录
相关文章
|
7月前
|
人工智能 缓存 开发工具
结合企业实践来规范你的Git commit(含插件使用指南)
结合企业实践来规范你的Git commit(含插件使用指南)
结合企业实践来规范你的Git commit(含插件使用指南)
|
7月前
|
开发工具 git
Git Commit Msg
Git Commit Msg
72 0
|
7月前
|
JSON 开发工具 git
git rebase 合并当前分支的多个commit记录
git rebase 合并当前分支的多个commit记录
145 1
|
3月前
|
开发工具 git
GIT:如何合并已commit的信息并进行push操作
通过上述步骤,您可以有效地合并已提交的信息,并保持项目的提交历史整洁。记得在执行这些操作之前备份当前工作状态,以防万一。这样的做法不仅有助于项目维护,也能提升团队协作的效率。
154 4
|
3月前
|
开发工具 git
GIT:如何合并已commit的信息并进行push操作
通过上述步骤,您可以有效地合并已提交的信息,并保持项目的提交历史整洁。记得在执行这些操作之前备份当前工作状态,以防万一。这样的做法不仅有助于项目维护,也能提升团队协作的效率。
257 3
|
4月前
|
开发工具 git
Git——commit的提交规范
Git——commit的提交规范
109 4
|
4月前
|
测试技术 持续交付 开发工具
[译] 为何每次 Git Commit 要尽可能小?
[译] 为何每次 Git Commit 要尽可能小?
|
4月前
|
Java 开发工具 Android开发
Android Studio利用Build.gradle导入Git commit ID、Git Branch、User等版本信息
本文介绍了在Android Studio项目中通过修改`build.gradle`脚本来自动获取并添加Git的commit ID、branch名称和用户信息到BuildConfig类中,从而实现在编译时将这些版本信息加入到APK中的方法。
84 0
|
5月前
|
前端开发 JavaScript 开发工具
前端优化之路:git commit 校验拦截
前面在git分支规范那篇文章里,介绍了commit提交规范,但是想要做到高效落地执行,就需要做些别的功课。
|
4月前
|
IDE 开发工具 git
我是怎么写 Git Commit message 的?
我是怎么写 Git Commit message 的?
55 0