使用gpg能做的一些事情, 以及一些注意事项和建议.

gpg能用来干嘛

  1. 加密/解密
  2. 签名
  3. 认证

gpg软件准备

这里都指GnuPG linux发行版都可以直接通过软件仓库安装, apt/yum macOS可以用brew安装 版本要求: >= 2.1.7 理由: GnuPG 2.1.7开始, 支持Curve25519, 有兴趣的朋友可以去了解一下Curve25519 Ed25519 ecdsa rsa等算法的区别和对比. 我们这里选择最优和最安全的, 所以就是Curve25519和Ed25519

使用过程

生成主密钥, 有效期为永久

这里一定注意, 只生成认证(Certify)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
gpg --expert --full-generate-key                                                                                                                           ✔  11m 56s   23:09:50  
gpg (GnuPG) 2.4.8; Copyright (C) 2025 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥类型:
   (1) RSA 和 RSA 
   (2) DSA 和 Elgamal 
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
   (7) DSA(自定义用途)
   (8) RSA(自定义用途)
   (9) ECC(签名和加密) *默认*
  (10) ECC(仅用于签名)
  (11) ECC(自定义用途)
  (13) 现有密钥 
 (14)卡中现有密钥 
您的选择是? 11

ECC 密钥的可实现的功能: 签名(Sign) 认证(Certify) 身份验证(Authenticate) 
目前启用的功能: 签名(Sign) 认证(Certify) 

   (S) 签名功能开关
   (A) 身份验证功能开关
   (Q) 已完成

您的选择是? s

ECC 密钥的可实现的功能: 签名(Sign) 认证(Certify) 身份验证(Authenticate) 
目前启用的功能: 认证(Certify) 

   (S) 签名功能开关
   (A) 身份验证功能开关
   (Q) 已完成

您的选择是? q
请选择您想要使用的椭圆曲线:
   (1) Curve 25519 *默认*
   (2) Curve 448
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
您的选择是? 
请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 
密钥永远不会过期
这些内容正确吗? (y/N) y

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

真实姓名: 何庆 Ching He
电子邮件地址: heqing@rool.me
注释: 
您正在使用‘utf-8’字符集。
您选定了此用户标识:
    “何庆 Ching He <heqing@rool.me>”

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

pub   ed25519 2025-12-12 [C]
      05426E81010BD7E474010F590ACF9AD8D2A9937D
uid                      何庆 Ching He <heqing@rool.me>

使用主密钥生成三个子密钥,分别为加密,签署,认证

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
gpg --expert --edit-key 05426E81010BD7E474010F590ACF9AD8D2A9937D                                                                                     INT ✘  2m 39s   23:18:44  
gpg (GnuPG) 2.4.8; Copyright (C) 2025 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

私钥可用。

sec  ed25519/0ACF9AD8D2A9937D
     创建于:2025-12-12  有效至:永不       可用于:C   
     信任度:绝对        有效性:绝对
[ 绝对 ] (1). 何庆 Ching He <heqing@rool.me>

gpg> addkey
请选择您要使用的密钥类型:
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
   (5) ElGamal(仅用于加密)
   (6) RSA(仅用于加密)
   (7) DSA(自定义用途)
   (8) RSA(自定义用途)
  (10) ECC(仅用于签名)
  (11) ECC(自定义用途)
  (12) ECC(仅用于加密)
  (13) 现有密钥 
 (14)卡中现有密钥 
您的选择是? 10
请选择您想要使用的椭圆曲线:
   (1) Curve 25519 *默认*
   (2) Curve 448
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
您的选择是? 
请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 
密钥永远不会过期
这些内容正确吗? (y/N) y
真的要创建吗?(y/N) y
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。

sec  ed25519/0ACF9AD8D2A9937D
     创建于:2025-12-12  有效至:永不       可用于:C   
     信任度:绝对        有效性:绝对
ssb  ed25519/A442A8BD5C05A571
     创建于:2025-12-12  有效至:永不       可用于:S   
[ 绝对 ] (1). 何庆 Ching He <heqing@rool.me>

gpg> addkey
请选择您要使用的密钥类型:
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
   (5) ElGamal(仅用于加密)
   (6) RSA(仅用于加密)
   (7) DSA(自定义用途)
   (8) RSA(自定义用途)
  (10) ECC(仅用于签名)
  (11) ECC(自定义用途)
  (12) ECC(仅用于加密)
  (13) 现有密钥 
 (14)卡中现有密钥 
您的选择是? 12
请选择您想要使用的椭圆曲线:
   (1) Curve 25519 *默认*
   (2) Curve 448
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
您的选择是? 
请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 
密钥永远不会过期
这些内容正确吗? (y/N) y
真的要创建吗?(y/N) y
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。

sec  ed25519/0ACF9AD8D2A9937D
     创建于:2025-12-12  有效至:永不       可用于:C   
     信任度:绝对        有效性:绝对
ssb  ed25519/A442A8BD5C05A571
     创建于:2025-12-12  有效至:永不       可用于:S   
ssb  cv25519/33086EB02C3025AC
     创建于:2025-12-12  有效至:永不       可用于:E   
[ 绝对 ] (1). 何庆 Ching He <heqing@rool.me>

gpg> addkey
请选择您要使用的密钥类型:
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
   (5) ElGamal(仅用于加密)
   (6) RSA(仅用于加密)
   (7) DSA(自定义用途)
   (8) RSA(自定义用途)
  (10) ECC(仅用于签名)
  (11) ECC(自定义用途)
  (12) ECC(仅用于加密)
  (13) 现有密钥 
 (14)卡中现有密钥 
您的选择是? 11

ECC 密钥的可实现的功能: 签名(Sign) 身份验证(Authenticate) 
目前启用的功能: 签名(Sign) 

   (S) 签名功能开关
   (A) 身份验证功能开关
   (Q) 已完成

您的选择是? a

ECC 密钥的可实现的功能: 签名(Sign) 身份验证(Authenticate) 
目前启用的功能: 签名(Sign) 身份验证(Authenticate) 

   (S) 签名功能开关
   (A) 身份验证功能开关
   (Q) 已完成

您的选择是? s

ECC 密钥的可实现的功能: 签名(Sign) 身份验证(Authenticate) 
目前启用的功能: 身份验证(Authenticate) 

   (S) 签名功能开关
   (A) 身份验证功能开关
   (Q) 已完成

您的选择是? q
请选择您想要使用的椭圆曲线:
   (1) Curve 25519 *默认*
   (2) Curve 448
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
您的选择是? 
请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 
密钥永远不会过期
这些内容正确吗? (y/N) y
真的要创建吗?(y/N) y
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。

sec  ed25519/0ACF9AD8D2A9937D
     创建于:2025-12-12  有效至:永不       可用于:C   
     信任度:绝对        有效性:绝对
ssb  ed25519/A442A8BD5C05A571
     创建于:2025-12-12  有效至:永不       可用于:S   
ssb  cv25519/33086EB02C3025AC
     创建于:2025-12-12  有效至:永不       可用于:E   
ssb  ed25519/124BCC07E4045BE6
     创建于:2025-12-12  有效至:永不       可用于:A   
[ 绝对 ] (1). 何庆 Ching He <heqing@rool.me>

gpg> save

导出主密钥和公钥, 离线多地保存, 删除主密钥/公钥

1
2
3
4
5
gpg --export-secret-keys 0ACF9AD8D2A9937D > ./heqing@rool.me_full_keys 
gpg --export-secret-subkeys 0ACF9AD8D2A9937D > ./heqing@rool.me_subkeys
gpg --export 0ACF9AD8D2A9937D > ./heqing@rool.me_pub
#来个吊销密钥
gpg --gen-revoke 0ACF9AD8D2A9937D > ./heqing@rool.me_revoke

加密/解密的过程

签署的过程

加密+签署

认证的使用办法(ssh)

下面的操作其实有点不合适和优雅, 我选择用gpg的认证子密钥来进行ssh认证, 但是并不想用gpg-agent来认证,我这里采用1password-agent来进行认证 因为我平常用1password, 这样认证会更精细, 但是1password不支持gpg进行ssh认证, 于是我就需要用工具转换一下, 以前有一个monkeysphere的包,里面有openpgp2ssh的python工具. 但是已经失效. 这里采用go写的一个库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
git clone git@github.com:pinpox/pgp2ssh.git
cd pgp2ssh
go build
gpg --export-secret-subkeys --armor   0ACF9AD8D2A9937D > priv-gpg
./pgp2ssh                                                                                                                                                              ✔  08:53:11  
2025/12/13 08:53:12 Enter path to private PGP key (default: ./priv.asc):
priv-gpg
2025/12/13 08:53:18 Keys:
2025/12/13 08:53:18 [0] 0ACF9AD8D2A9937D (primary)
2025/12/13 08:53:18 [1] A442A8BD5C05A571 (subkey)
2025/12/13 08:53:18 [2] 33086EB02C3025AC (subkey)
2025/12/13 08:53:18 [3] 124BCC07E4045BE6 (subkey)
2025/12/13 08:53:18 Choose key by index (default: 0):
3
2025/12/13 08:53:24 Continuing with key [3] 124BCC07E4045BE6
2025/12/13 08:53:24 Please enter passphrase to decrypt PGP key:
2025/12/13 08:53:34 private key type: *eddsa.PrivateKey
2025/12/13 08:53:34 public key type: eddsa.PublicKey
2025/12/13 08:53:34 public SSH key:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOxYfIXQOaudQAQH63UkKIM2gTQl1TbBJ5pJvOhl3l2x

2025/12/13 08:53:34 Private SSH key:
-----BEGIN OPENSSH PRIVATE KEY-----

配合yubikey使用