- gpg
- 查看本地
gpg
密钥列表 - 创建
gpg
密钥 git
默认gpg
密钥- 使用
gpg
签名提交 - 使用
gpg
签名tag
git merge
合并git pull
拉取提交git push
推送- git rebase
AndroidStudio
使用gpg
签名Windows
无法找到gpg
密钥问题- 参考
gpg
即GNU Privacy Guard(GnuPG或GPG)
是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥,是自由基金会开发的OpenPGP
软件,遵循OpenPGP数据加解密标准(RFC 4880)
,与PGP
保持兼容。
使用方法见:https://daemonyang.blogspot.com/2021/12/gpg.html
查看本地gpg
密钥列表
$ gpg -k
创建gpg
密钥
$ gpg --gen-key
git
默认gpg
密钥
可以配置全局/本地的默认签名密钥
添加到全局
$ git config --global user.signingkey 23E3B35D753BC78E
或者使用--local
配置单个项目
$ git config --local user.signingkey 23E3B35D753BC78E
配置的默认签名密钥可供git commit
和git tag
使用
使用gpg
签名提交
使用-S[<keyid>], --gpg-sign[=<keyid>]
选项指定git commit
使用的gpg
签名
keyid
为可选项,如果指定,必须紧挨着-S
,中间不能有空格;如果不指定,则使用提交者信息Your Name <your@email.address>
来查找gpg
密钥并使用;如果配置了user.signingkey
,则采用user.signingkey
配置的默认gpg
密钥进行签名
譬如gpg
签名密钥的ID
为23E3B35D753BC78E
$ git commit -S23E3B35D753BC78E -m "commit message"
或
$ git commit --gpg-sign=23E3B35D753BC78E -m "commit message"
通过git log --show-signature
可以查看带签名信息的提交记录
commit.gpgSign
强制签名
可以设置commit.gpgSign
配置项,强制git commit
使用gpg
密钥签署每个提交:
$ git config --global commit.gpgsign true
或者使用--local
配置单个项目
$ git config --local commit.gpgsign true
取消强制签名配置
使用--no-gpg-sign
选项取消commit.gpgsign
配置项设置的强制签名限制
使用gpg
签名tag
-s
默认密钥签名
git tag
命令使用-s, --sign
选项时,会根据提交者信息Your Name <your@email.address>
来查找gpg
密钥用来签署tag
;如果配置了默认签名密钥user.signingkey
,则使用默认密钥进行签名。示例:
$ git tag -s v1.0.1 -m "tag v1.0.1"
如果你不希望使用自定义gpg
密钥,可以配置默认签署密钥:
$ git config --global user.signingkey 23E3B35D753BC78E # 或者使用--local配置单个项目
签署完成可以使用git show
来查看:
$ git show v1.0.1
tag v1.0.1
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:29:41 2014 -0700
tag v1.0.1
-----BEGIN PGP SIGNATURE-----
iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut
LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b
hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm
ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp
8S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi
RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
=EFTF
-----END PGP SIGNATURE-----
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
-u
自定义密钥签名
可以使用-u <keyid>, --local-user=<keyid>
选项手动指定gpg
密钥:
$ git tag -u 23E3B35D753BC78E v1.0.1 -m "tag v1.0.1"
tag.gpgSign
可以设置tag.gpgSign
配置项,强制git tag
使用gpg
密钥签署每个tag
:
$ git config --global tag.gpgsign true
或者使用--local
配置单个项目
$ git config --local tag.gpgsign true
注意,-u <keyid>, --local-user=<keyid>
选项不受这个配置项控制
--no-sign
取消强制签名配置
使用--no-sign
选项取消tag.gpgSign
配置项设置的强制签名限制
git merge
合并
--verify-signatures
检查签名
git merge
命令可以使用--verify-signatures
选项检查并拒绝携带可信密钥签署的提交:
$ git merge --verify-signatures non-verify-branch
fatal: Commit ab06180 does not have a GPG signature.
-S
签署合并生成的提交
-S[<keyid>], --gpg-sign[=<keyid>]
选项使用方式与git commit
的同名选项相同,可以为合并生成的提交使用密钥进行签署
$ git merge --verify-signatures -S signed-branch
Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) <schacon@gmail.com>
You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <schacon@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04
Merge made by the 'recursive' strategy.
README | 2 ++
1 file changed, 2 insertions(+)
git pull
拉取提交
--verify-signatures
检查签名
git pull
命令也可以使用--verify-signatures
选项检查并拒绝携带可信密钥签署的提交:
$ git pull --verify-signatures origin master
fatal: Commit ab06180 does not have a GPG signature.
-S
签署合并生成的提交
-S[<keyid>], --gpg-sign[=<keyid>]
选项使用方式与git merge
相同,可以为合并生成的提交使用密钥进行签署
$ git pull --verify-signatures -S signed-branch
git push
推送
--no-signed
、--signed=false
不签署推送
--signed
、--signed=true
签署推送,如果服务器不支持签署推送,则推送失败
--signed=if-asked
如果服务器支持签署推送,则签署;不支持则不签署,不会直接失败
git rebase
-S
签署变基生成的提交
-S[<keyid>], --gpg-sign[=<keyid>]
选项使用方式与git merge
相同,可以为变基生成的提交使用密钥进行签署
$ git rebase -S signed-branch
AndroidStudio
使用gpg
签名
修改配置文件:
# Linux/macOS
~/.gnupg/gpg.conf
# Windows 10
C:\Users\<user name>\.gnupg\gpg.conf
添加:
use-agent
no-tty
default-key 23E3B35D753BC78E
Windows
无法找到gpg
密钥问题
git commit -a -S -m "modify .gitignore file"
gpg: skipped "A012BF1DEF404999678A307A23E3B35D753BC78E": No secret key
gpg: signing failed: No secret key
error: gpg failed to sign the data
fatal: failed to write commit object
解决
https://stackoverflow.com/a/51009405
$ git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
参考
Telling Git about your signing key
https://docs.github.com/en/github/authenticating-to-github/managing-commit-signature-verification