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

GPG概念及安装
官方中文文档
GPG官方下载
核心是命令行,也有对应的 GUI 客户端,看自己喜欢了。
简化版姿势
假设你已经知道 GPG 是个什么东西,这里只说明在 Mac下如何快速生成公钥和密钥。
安装
我用的是 brew
包管理,可以理解为类似 yum
或 apt-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 服务商都提供这个支持,当前Github 和GitLab是支持的,
国内的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
总结
其实大体流程跟配置 ssh
密钥差不多,只是用了不同的东西生成对应所需的东西。
转载自:https://juejin.cn/post/6844903966002642951