GPG的一些安装和使用

GPG的一些安装和使用

关于一些GPG安装、使用的介绍

一、简介

1991年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。

GPG有许多用途,本文主要介绍文件加密。至于邮件的加密,不同的邮件客户端有不同的设置,请参考Ubuntu网站的介绍

二、安装

安装有源码安装和安装包管理器安装两种方式,均已通过验证。

官方文档:The GNU Privacy Handbook

1、在MacoOS上通过源码安装

  1. 进入GnuPG官网下载的源码,这里可以下载GnuPG(LTS)

  2. 下载至本地后对其进行解压,进入文件夹,使用命令./configure,进行依赖检查。如依赖软件齐全,则可使用sudo make -j4 && make install进行直接的安装。待过程结束后则安装完毕。

  3. 若在./configure途中出现依赖缺失,则需要按照提醒安装依赖,依赖的源码在GnuPG官网下也有。结合我安装的时候的报错,我新安装的依赖有:

    • Libgpg-error
    • libgcrypt(LTS)
    • Libksba
    • Libassuan
    • nPth
  4. 依赖的源码下载解压后,在其文件夹下执行./configure以及sudo make -j4 && make install即可完成依赖安装。

2、在Ubuntu-20.04 LTS上通过安装管理器安装

执行该命令安装

1
sudo apt-get install gnupg

三、使用

1、生成密钥

在终端中输入:

1
gpg --full-gen-key

将会见到

1
2
3
4
5
6
7
8
9
10
11
12
13
gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: directory '/home/unix/.gnupg' created
gpg: keybox '/home/unix/.gnupg/pubring.kbx' created
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(14) Existing key from card
Your selection?

中文翻译就是

1
2
3
4
5
6
7
8
9
10
11
12
13
gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: 已创建目录‘/home/unix/.gnupg’
gpg: 钥匙串 '/home/unix/.gnupg/pubring.kbx' 已建立
请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
(14) Existing key from card
您的选择?

这里是需要选择密钥的种类(14那个选不了,不知啥玩意)。按下1,回车。

1
2
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)

中文翻译

1
2
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸(3072)?

这里我们就选择默认的的3072,直接回车。

1
2
3
4
5
6
7
8
Requested keysize is 3072 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)

对应

1
2
3
4
5
6
7
8
您所要求的密钥尺寸是 3072 位              
请设定这把密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)

如果要设计期限,输入对应数字以及选项,如3年,输入3y。

1
2
3
4
5
6
Key expires at Mon Feb 24 19:03:14 2025 CST
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name:

中途的y是输入确认的,然后按照提醒输入名字,邮箱(最好和gitee、github上的登记邮箱一样)以及注释(可选)。

1
2
3
4
5
You are using the 'utf-8' character set.
You selected this USER-ID:
"名字 (注释) <邮箱@mail.cn>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

字母O确认输入信息是否正确。

接下来就是提醒要输入密码,TAB选择下面选项:

密码输入提醒

如果输入密码太简单,会提醒你要不要换个强一点的

密码提醒简单

确认密码

确认密码

密码输入完成后,显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
dgpg: /home/unix/.gnupg/trustdb.gpg: trustdb created
gpg: key XXXXXXXXC33F4 marked as ultimately trusted
gpg: directory '/home/unix/.gnupg/openpgp-revocs.d' created
public and secret key created and signed.

pub rsa3072 2022-02-25 [SC] [expires: 2025-02-24]
XXXXXXXXC33F4
uid 名字 (注释) <邮箱@mail.cn>
sub rsa3072 2022-02-25 [E] [expires: 2025-02-24]

翻译一下

1
2
3
4
5
6
7
8
我们需要生成很多随机字节。 执行是个好主意其他一些操作(在键盘上键入、移动鼠标、使用磁盘)在主要生成期间; 这给出了随机数
发电机有更好的机会获得足够的熵。
我们需要生成很多随机字节。 执行是个好主意其他一些操作(在键盘上键入、移动鼠标、使用磁盘)在主要生成期间; 这给出了随机数
发电机有更好的机会获得足够的熵。
dgpg: /home/unix/.gnupg/trustdb.gpg: trustdb 已创建
gpg:密钥 XXXXXXXXC33F4 标记为最终受信任
gpg:创建目录'/home/unix/.gnupg/openpgp-revocs.d'
公钥和私钥已被创建和签名。

这里就生成好了,XXXXXXXXC33F4就是用户ID,可以代替用户名的操作。

通过gpg --gen-revoke XXXXXXXXC33F4可以生成一张”撤销证书”,以备以后密钥作废时,可以请求外部的公钥服务器撤销你的公钥。

四、其他一些命令

list-keys参数列出系统中已有的密钥

1
gpg --list-keys

如果你要从密钥列表中删除某个密钥,可以使用delete-key参数。

1
gpg --delete-key [用户ID]

公钥文件.gnupg/pubring.gpg以二进制形式储存,armor参数可以将其转换为ASCII码显示。

1
gpg --armor --output public-key.txt --export [用户ID]

用户ID指定哪个用户的公钥,output参数指定输出文件名public-key.txt

类似地,export-secret-keys参数可以转换私钥。

1
gpg --armor --output private-key.txt --export-secret-keys

打开public-key.txt private-key.txt 就能看到公钥和私钥了。

五、与git相关

开启git的commit默认签名

1
git config --global commit.gpgsign true

不开启的话要每次commit使用

1
git commit -S -m "message"

指定要前面的用户ID

1
git config --global user.signingkey XXXXXXXXC33F4

指定gpg用的程序

1
git config --global gpg.program gpg

查看log显示签名

1
git log --show-signature

六、一些坑

不支持中文报错

1
gpg: conversion from 'utf-8' to 'US-ASCII' failed: Illegal byte sequence

则需要修改~/.gnupg/gpg.conf文件

1
2
3
cat >> ~/.gnupg/gpg.conf <<EOF
charset utf-8
EOF

缺少依赖Pinentry

体现为在创建GPG公钥的不能输密码,报错退出。

需要在GnuPG官网下载Pinentry源码进行安装。

commit时遇到了GPG签名失败的错误

体现为输出

1
2
error: gpg failed to sign the data
fatal: failed to write commit object

解决方法为加入$(tty)的变量

~/.zshrc加入export GPG_TTY=$(tty),然后source ~/.zshrc

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×