GPG 安装与使用

3,722 阅读8分钟

1、说明

最近使用 GitHub 时无意间看见 commit 历史中有些带有 Verified 的标识,而有些没有,如下图,

经查看发现 Github 默认使用了 GPG 进行签名(用其自己的 key ),来保证提交信息来自可靠的来源。

官方说明:

You can sign your work locally using GPG or S/MIME. GitHub will verify these signatures so other people will know that your commits come from a trusted source. GitHub will automatically sign commits you make using the GitHub web interface.

关于 GPG

GnuPG(GNU Privacy Guard,GPG)是一种加密软件,它是 PGP 加密软件的满足GPL协议的替代物 。用于加密、数字签章及产生非对称匙对的软件 ^[1] 。用于加密、签名通信内容及管理非对称密码学的密钥

这里简记 GPG 安装配置到 Git 中遇到的相关问题及解决办法。

2、安装及生成密钥

官网为:https://gnupg.org,软件包有:

  • win: Gpg4win,或者 Cygwin 内置的 Gnupg;

  • mac : GPGTools(GUI 界面);

  • linux/unix: 包管理器安装或源码编译。

这里以 brew 安装 gnupg 为例。

1、安装当前安装的软件包为目前最新的:brew info gpg

 1 > brew info gpg 2gnupg: stable 2.2.15 (bottled) 3GNU Pretty Good Privacy (PGP) package 4https://gnupg.org/ 5/usr/local/Cellar/gnupg/2.2.15 (135 files, 11MB) * 6  Poured from bottle on 2019-05-29 at 10:17:33 7From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/gnupg.rb 8==> Dependencies 9Build: pkg-config ✔10Required: adns ✔, gettext ✔, gnutls ✔, libassuan ✔, libgcrypt ✔, libgpg-error ✔, libksba ✔, libusb ✔, npth ✔, pinentry ✔11==> Analytics12install: 30,935 (30 days), 134,827 (90 days), 517,582 (365 days)13install_on_request: 25,763 (30 days), 108,154 (90 days), 407,474 (365 days)14build_error: 0 (30 days)15> 

由于依赖较多,可以给 brew 设置镜像源来加速,然后进行安装:

1brew install gpg

网上有说安装 gpg2,经测试安装的均是 gnupg

2、生成密钥非新使用 gpg ,可以使用 gpg -k 查看是否有证书,如下为有证书的示例:

1 > gpg -k2/Users/imtianx/.gnupg/pubring.kbx3---------------------------------4pub   rsa4096 2019-05-28 [SC]5      0A50E2B85C6E124AD0A1701FBFB191F8AFA7E8606uid           [ultimate] imtianx (Signed-off-by imtianx on mbp.) <imtianx@gmail.com>7sub   rsa4096 2019-05-28 [E]8> 

如果没有,使用如下命令进行生成:

1gpg --full-generate-key

接着会有如下相关的提示,按照步骤设置信息:

  1. 选择加密算法,回车 默认 RSARSA,或可输入对应的序号选择加密算法;

  2. 输入密钥长度,默认 2048,最大 4096,推荐使用 4096,输入然后回车;

  3. 密钥有效期,默认 0 永不过期;

    10 = 密钥永不过期2<n> = 密钥在 n 天后过期3<n>w = 密钥在 n 周后过期4<n>m = 密钥在 n 月后过期5<n>y = 密钥在 n 年后过期 
  4. 确认是否正确;

  5. 设置个人信息:姓名、邮箱和注释(这个在以后可以进行添加删除等操作);

  6. 确认用户标识,若无需修改,确认后即可生成密钥。

由于个人的 gpg 未使用过,这里未给出具体的创建信息。

具体的步骤可参考:

  • Github-Generating a new GPG key

  • 阮一峰-GPG入门教程

如果想要可视化页面操作,Mac 用户可以直接安装 GPGTools。

3、常用命令

查看密钥信息,ID 为  BFB191F8AFA7E860:

1 > gpg --list-secret-keys --keyid-format LONG2/Users/imtianx/.gnupg/pubring.kbx3---------------------------------4sec   rsa4096/BFB191F8AFA7E860 2019-05-28 [SC]5      0A50E2B85C6E124AD0A1701FBFB191F8AFA7E8606uid                 [ultimate] imtianx (Signed-off-by imtianx on mbp.) <imtianx@gmail.com>7ssb   rsa4096/B331F00185D28960 2019-05-28 [E]

显示公钥内容;

1gpg --armor --export <gpg_kek_id>

输出公钥到文件 public-key.txt

1gpg --armor --output public-key.txt --export <gpg_kek_id>

gpg 加密文件:

1gpg --recipient <gpg_key_id> --output <output_file_name> --encrypt <input_file_name>

gpg 解密:

1gpg --output <output_file_name> --decrypt <input_file_name>

这里需要注意,--output 参数需要放前面。如果未将私钥的密码保存到钥匙串,这里会弹出输入密码窗口。

此外,可以将自己的公钥上传到 GPG server,供他人使用。其他更多命令,可通过 gpg --help 查看。

添加用户标识信息:

1gpg --edit-key <gpg_key——id>/<email>

进入 gpg 后可使用 help 查看所有的操作:

 1pg> help 2quit        quit this menu 3save        save and quit 4help        show this help 5fpr         show key fingerprint 6grip        show the keygrip 7list        list key and user IDs 8uid         select user ID N 9key         select subkey N10check       check signatures11sign        sign selected user IDs [* see below for related commands]12lsign       sign selected user IDs locally13tsign       sign selected user IDs with a trust signature14nrsign      sign selected user IDs with a non-revocable signature15adduid      add a user ID16addphoto    add a photo ID17deluid      delete selected user IDs18addkey      add a subkey19addcardkey  add a key to a smartcard20keytocard   move a key to a smartcard21bkuptocard  move a backup key to a smartcard22delkey      delete selected subkeys23addrevoker  add a revocation key24delsig      delete signatures from the selected user IDs25expire      change the expiration date for the key or selected subkeys26primary     flag the selected user ID as primary27pref        list preferences (expert)28showpref    list preferences (verbose)29setpref     set preference list for the selected user IDs30keyserver   set the preferred keyserver URL for the selected user IDs31notation    set a notation for the selected user IDs32passwd      change the passphrase33trust       change the ownertrust34revsig      revoke signatures on the selected user IDs35revuid      revoke selected user IDs36revkey      revoke key or selected subkeys37enable      enable key38disable     disable key39showphoto   show selected photo IDs40clean       compact unusable user IDs and remove unusable signatures from key41minimize    compact unusable user IDs and remove all signatures from key4243* The 'sign' command may be prefixed with an 'l' for local signatures (lsign),44  a 't' for trust signatures (tsign), an 'nr' for non-revocable signatures45  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).

修改标识比较麻烦,推荐新建,旧的标识如果未使用可以删除,若有使用可以是指撤销。

4、Git 配置

对于在 Git 中使用,需要开启签名,设置密钥Id:

1git config --global user.signingkey <key_id>2// 如果是 gpg2 ,需对应的更换3git config --global gpg.program gpg4// 开启提交签名,或者 commit 时添加 -s 参数5git config --global commit.gpgsign true

未使用 GPGTools,添加到环境变量:

1export GPG_TTY=$(tty)

注意需要在对应的 Git 服务网站(GitHub/Gitlab)添加 GPG 公钥;还有用户信息呢需要对应。

然后在使用的时候,commit 记录就会有校验通过的标识,如下:

在查看 git log 时可以显示相关的签名信息:

1git log --show-signature -1

输出为:

1commit 6b05e365de6a28b3054a5e6481c8e214552d20102gpg: Signature made Tue May 28 15:53:24 2019 CST3gpg:                using RSA key 0A50E2B85C6E124AD0A1701FBFB191F8AFA7E8604gpg: Good signature from "imtianx (Signed-off-by imtianx on mbp.) <imtianx@gmail.com>" [ultimate]5Author: imtianx <imtianx@gmail.com>6Date:   Tue May 28 15:53:24 2019 +080078    test gpg;

可以参考 Gtihub 文档:Telling Git about your signing key

如有问题可参见 常见错误

5、Sourcetree 配置

与 Git 设置相比,这里较为麻烦。首先,Sourcetree 默认支持 gpg2,这里需要设置 gpg2 的软连接否则 sourcetree 无法识别:

1// 进入 gnupg 安装目录中的bin中2cd /usr/local/Cellar/gnupg/2.2.15/bin3ln -s gpg gpg2

然后设置 gpg 目录,如下图:

接着,开启仓库 gpg 设置:

然后,开启签名设置:

在首次提交时,未保存私钥密码,会弹出如下弹框:

最后,开启签名后的提交信息如下:

到此,整个 Sourcetree 的配置完成,遇到较多的问题可能就是 commit 加密失败。

6、常见错误

1、commit 签名错误:

1error: gpg failed to sign the data2fatal: failed to write commit object

可以在终端输入:

1export GPG_TTY=$(tty)

然后,测试 gpg ,弹出密码框并确认输入后可暂时解决,如下测试示例:

1echo "test" | gpg --clearsign

可以使用下面方式彻底解决,会弹出输入密码弹框

1brew install pinentry-mac2echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf3killall gpg-agent

2、agent_genkey 错误

1gpg: agent_genkey failed: No such file or directory

查找该进程并kill 掉:

1ps axu | grep gpg-agent2kill -9 <process_id>

如有问题,请留言交流。