显示标签为“gpg”的博文。显示所有博文
显示标签为“gpg”的博文。显示所有博文

2022年2月28日星期一

使用gpg签署git

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 commitgit tag使用

使用gpg签名提交

使用-S[<keyid>], --gpg-sign[=<keyid>]选项指定git commit使用的gpg签名

keyid为可选项,如果指定,必须紧挨着-S,中间不能有空格;如果不指定,则使用提交者信息Your Name <your@email.address>来查找gpg密钥并使用;如果配置了user.signingkey,则采用user.signingkey配置的默认gpg密钥进行签名

譬如gpg签名密钥的ID23E3B35D753BC78E

$ 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"

参考

gpg

man page: git-config

man page: git-commit

man page: git-tag

man page: git-merge

man page: git-pull

man page: git-push

man page: git-rebase

Telling Git about your signing key

https://docs.github.com/en/github/authenticating-to-github/managing-commit-signature-verification

Set up Keybase.io, GPG & Git to sign commits on GitHub

Android Studio and Git - How do I GPG-sign my commits?

2021年12月20日星期一

gpg

 

查看gpg工具版本号

% gpg --version
gpg (GnuPG) 2.2.21
libgcrypt 1.8.6
Copyright (C) 2020 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/user/.gnupg
支持的算法:
公钥: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
密文: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
    CAMELLIA128, CAMELLIA192, CAMELLIA256
散列: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩:  不压缩, ZIP, ZLIB, BZIP2

创建密钥

% gpg --gen-key

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: test
姓名至少要有五个字符长
真实姓名: gpgtest
电子邮件地址: gpgtest@gpgtest.test
您选定了此用户标识:
    “gpgtest <gpgtest@gpgtest.test>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
gpg: 密钥 721AD549AF7EE528 被标记为绝对信任
gpg: 吊销证书已被存储为‘/Users/user/.gnupg/openpgp-revocs.d/037C102307A3DEF80A15CB2A721AD549AF7EE528.rev’
公钥和私钥已经生成并被签名。

pub   rsa2048 2021-04-10 [SC] [有效至:2023-04-10]
      037C102307A3DEF80A15CB2A721AD549AF7EE528
uid                      gpgtest <gpgtest@gpgtest.test>
sub   rsa2048 2021-04-10 [E] [有效至:2023-04-10]

使用gpg --gen-key流程比较简略,许多参数自动使用默认配置,也可用使用gpg --full-generate-key来自定义完整流程:

% gpg --full-generate-key

请选择您要使用的密钥类型:
   (1) RSA 和 RSA (默认)
   (2) DSA 和 Elgamal
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
  (14) Existing key from card
您的选择是? 1
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(2048)
请求的密钥长度是 2048 位
请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期
这些内容正确吗? (y/N) y

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: gpgtest
电子邮件地址: gpgtest@gpgtest.test
注释:
您选定了此用户标识:
    “gpgtest <gpgtest@gpgtest.test>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
gpg: 密钥 721AD549AF7EE528 被标记为绝对信任
gpg: 吊销证书已被存储为‘/Users/user/.gnupg/openpgp-revocs.d/037C102307A3DEF80A15CB2A721AD549AF7EE528.rev’
公钥和私钥已经生成并被签名。

pub   rsa2048 2021-04-10 [SC] [有效至:2023-04-10]
      037C102307A3DEF80A15CB2A721AD549AF7EE528
uid                      gpgtest <gpgtest@gpgtest.test>
sub   rsa2048 2021-04-10 [E] [有效至:2023-04-10]

默认会同时创建密钥对应的吊销证书。

密码限制:

  1. 至少8个字符
  2. 至少包含一个数字或特殊字符

创建吊销证书

% gpg --gen-revoke DCDECC17ADB5DC35

sec  rsa2048/DCDECC17ADB5DC35 2021-04-10 gpgtest (test gpg key) <gpgtest@gpgptest.test>

要为这个密钥创建一个吊销证书吗?(y/N) y
请选择吊销的原因:
  0 = 未指定原因
  1 = 密钥已泄漏
  2 = 密钥被替换
  3 = 密钥不再使用
  Q = 取消
(也许您会想要在这里选择 1)
您的决定是什么? 3
请输入描述(可选);以空白行结束:
> just a test
>
吊销原因:密钥不再使用
just a test
这样可以吗? (y/N) y
已强行使用 ASCII 字符封装过的输出。
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: This is a revocation certificate

iQFBBCABCAArFiEEo0Rf+7oYz3Yv6FiX3N7MF6213DUFAmBxE8ANHQNqdXN0IGEg
dGVzdAAKCRDc3swXrbXcNa8VCAC1uk3A3p2Lo1mLTx7TSSAtLqlkv8c6555UmAXE
3loY8sWPviWgZIAoXenYD3FMMW5ioRee+w4/S23AdZVqkFRqkQfwOMpUAHUrAnid
U9kVIhaLO+D056c47IiykZxncVfL+rBVdAXMYQC4a1DqcwUcr4ojcqWyXDAvXLmV
W1dqU67XbZnV6ALNgKrprVv0hZwufM19eu0L3cRTSk8Le8xv2vepQQBFC+SXhT8n
F3fhygyrUkDQcOdszbAQnSNUqi+lxwjX6t0Gtpmmyilnid8J0mmVNvkavgMAIQwm
36K+2untc/A8UDYzqeELwEdpA9tabY2JzvgVdR/N1cRrdNMn
=fR5F
-----END PGP PUBLIC KEY BLOCK-----
已创建吊销证书。

请把这个文件转移到一个您可以藏起来的介质上;如果坏人获取到了这
份证书的话,那么他就能使用它并让您的密钥无法继续使用。把此证书
打印出来再存放到安全的地方也是很好的方法,以免您的保存媒体变得
不可读。但是千万小心:您机器上的打印系统可能会在打印过程中储存
这些数据,并使得其他人看到!

列出已有密钥

% gpg -k
/Users/user/.gnupg/pubring.kbx
---------------------------
pub   dsa2048 2010-08-19 [SC] [有效至:2024-05-11]
      85E38F69046B44C1EC9FB07B76D78F0500D026C4
uid           [ 未知 ] GPGTools Team <team@gpgtools.org>
uid           [ 未知 ] [jpeg image of size 6329]
sub   rsa4096 2014-04-08 [S] [有效至:2024-05-11]
sub   rsa4096 2020-05-11 [E] [有效至:2024-05-11]

pub   rsa4096 2020-05-04 [SC] [有效至:2024-05-03]
      B97E9964ACAD1907970D37CC8A9E3745558E41AF
uid           [ 未知 ] GPGTools Support <support@gpgtools.org>
sub   rsa4096 2020-05-04 [E] [有效至:2024-05-03]

pub   rsa2048 2021-04-10 [SC] [吊销于:2021-04-10]
      037C102307A3DEF80A15CB2A721AD549AF7EE528
uid           [ 已吊销 ] gpgtest <gpgtest@gpgtest.test>

pub   rsa2048 2021-04-10 [SC]
      A3445FFBBA18CF762FE85897DCDECC17ADB5DC35
uid           [ 绝对 ] gpgtest (test gpg key) <gpgtest@gpgptest.test>
sub   rsa2048 2021-04-10 [E]

或者

% gpg --list-keys

删除密钥

首先删除私钥

% gpg --delete-secret-keys 721AD549AF7EE528
...

sec  rsa2048/721AD549AF7EE528 2021-04-10 gpgtest <gpgtest@gpgtest.test>

要从钥匙环里删除这个密钥吗?(y/N) y
这是一个私钥!- 真的要删除吗?(y/N) y

然后删除公钥

% gpg --delete-key 721AD549AF7EE528

pub  rsa2048/721AD549AF7EE528 2021-04-10 gpgtest <gpgtest@gpgtest.test>

要从钥匙环里删除这个密钥吗?(y/N) y

导出密钥

导出二进制形式的公钥

% gpg --output public.key --export 721AD549AF7EE528

也可以导出文本形式的公钥

% gpg --armor --output public.key --export 721AD549AF7EE528

导出二进制形式私钥

% gpg --output secret.key --export-secret-keys 721AD549AF7EE528

也可以导出文本形式的私钥

% gpg --armor --output public.key --export-secret-keys 721AD549AF7EE528

导入密钥

% gpg --import 密钥文件

导入的密钥可以通过公共服务器搜索

搜索密钥

% gpg --keyserver hkps://keys.openpgp.org --search-keys [name]

上传到公钥服务器

% gpg --keyserver hkps://keys.openpgp.org --send-keys 721AD549AF7EE528
gpg: 正在发送密钥 721AD549AF7EE528 到 hkps://keys.openpgp.org

获取密钥指纹

% gpg --fingerprint 721AD549AF7EE528
pub   rsa2048 2021-04-10 [SC]
      A344 5FFB BA18 CF76 2FE8  5897 DCDE CC17 ADB5 DC35
uid           [ 绝对 ] gpgtest (test gpg key) <gpgtest@gpgptest.test>
sub   rsa2048 2021-04-10 [E]

加密

加密文件demo.txt

% gpg --recipient [name] --output demo.en.txt --encrypt demo.txt

解密

% gpg --output demo.de.txt --decrypt demo.en.txt

签名

生成二进制形式的签名文件

% gpg --sign demo.txt

生成文本形式的签名文件

% gpg --clearsign demo.txt

生成二进制形式独立签名文件

% gpg --detach-sign demo.txt

生成文本形式独立签名文件

% gpg --armor --detach-sign demo.txt

签名+加密

% gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt

验证签名

% gpg --verify demo.txt.asc demo.txt
gpg: 签名建立于 六  4/11 16:14:14 2020 CST
gpg:               使用 RSA 密钥 A3445FFBBA18CF762FE85897DCDECC17ADB5DC35
gpg: 完好的签名,来自于 “gpgtest <gpgtest@gpgtest.test>” [绝对]

参考

Managing commit signature verification

Generating a new GPG key

GPG入门教程

Android logcat

Log等级 Android log 等级在 android/log.h 中定义如下: typedef   enum   android_LogPriority {    /** For internal use only. */ ANDROID_LOG_UNKNOWN =...