GPG 命令

创建 gpg key

1
2
3
4
5
6
7
8
9
$ gpg --full-generate-key # 生成 gpg key
gpg: directory '/home/ubuntu/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/ubuntu/.gnupg/openpgp-revocs.d/ECA3A621F79A890A23D03ED5D5634A568BBCEDC4.rev'
public and secret key created and signed.

pub   ed25519 2024-11-09 [SC]
      ECA3A621F79A890A23D03ED5D5634A568BBCEDC4
uid                      test <[email protected]>
sub   cv25519 2024-11-09 [E]

列出

1
2
3
4
5
6
7
$ gpg --list-key                     # 简化写法 gpg -k
/home/ubuntu/.gnupg/pubring.kbx
-------------------------------
pub   ed25519 2024-11-09 [SC]
      ECA3A621F79A890A23D03ED5D5634A568BBCEDC4
uid           [ultimate] test <[email protected]>
sub   cv25519 2024-11-09 [E]

列出所有公钥、子公钥

  • pub 后市该密钥公钥的特征,密码参数(ed25519 算法,生成于 2024-11-09,用途是 sign 和 certificate),第二行是密钥 id。(该 gpg 密钥没有设置过期时间,否则会有个 expires: xxxx-xx-xx)
  • uid 是创建时输入的个人信息
  • sub 后面是默认一起创建的子密钥特征
1
$ gpg --list-secret-keys             # 简化写法 gpg -K 

列出所有私钥、子私钥

  • 加上 --fingerprint 输出指纹信息
  • 加上 --keyid-format long 输出子密钥的信息
1
2
3
4
5
6
7
$ gpg -k --fingerprint --keyid-format long
/home/ubuntu/.gnupg/pubring.kbx
-------------------------------
pub   ed25519/D5634A568BBCEDC4 2024-11-09 [SC]
      Key fingerprint = ECA3 A621 F79A 890A 23D0  3ED5 D563 4A56 8BBC EDC4
uid                 [ultimate] test <[email protected]>
sub   cv25519/D10AC240C941B8D4 2024-11-09 [E]

添加设置 ~.gnupg/gpg.conf ,就不用每次都输入这俩 option 了。

1
2
keyid-format 0xlong
with-fingerprint

输出密钥

1
2
3
$ gpg --armor --output public-key.txt --export [key_id]     # 输出指定公钥到 public-key.txt
$ gpg --export --armor [key_id]                             # 输出到 stdout
$ gpg --armor --output private-key.txt --export-secret-keys # 输出私钥到 private-key.txt

与公钥服务器交互

1
2
3
$ gpg --export [email protected] | curl -T - https://keys.openpgp.org
 # 将用户的 key 发送到公钥服务器,以便他人获取
$ gpg --import [key_file]

备份

1
2
$ gpg -ao public-key.txt --export [key_id]
$ gpg -ao secret-key --export-secret-key [key_id]!      # --armor --output. 结尾不加 ! 会同时输出主私钥和子私钥

删除

1
2
$ gpg --delete-secret-keys [key_id]
$ gpg --delete-keys [key_id]

对 git commit 进行签名

1
2
3
$ git config --global user.signkey [key_id]   # 设置 sign key id
$ git commit -S -m "..."                      # -S 单独的对某一个 commit 进行签名. 输入创建 key 时指定的 passphrase就好
$ git config --global commit.gpgsign true     # 设置对全部的 commit 进行签名,不用再 -S

Github 关联 GPG 公钥

运行命令 gpg --armor --export [key_id]--armor 表示以 ascii 字符的形式输出。

将命令的输出在 Github Add new GPG key 导入。

Trouble Shooting

  1. git commit 报错 PINENTRY_LAUNCHED 33014 curses 1.2.1 not a tty xterm-256color :0 ? 1000/1000 -

    1
    
    export GPG_TTY=`tty`
    

参考

  1. GPG入门教程

  2. 在 Github 上使用 GPG 的全过程

  3. 2021年,用更现代的方法使用PGP(上)

  4. 2021年,用更现代的方法使用PGP(中)

  5. 2021年,用更现代的方法使用PGP(下)

  6. GPG fails to load pinentry