关于一些GPG安装、使用的介绍
一、简介
1991年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。
GPG有许多用途,本文主要介绍文件加密。至于邮件的加密,不同的邮件客户端有不同的设置,请参考Ubuntu网站的介绍。
二、安装
安装有源码安装和安装包管理器安装两种方式,均已通过验证。
1、在MacoOS上通过源码安装
进入GnuPG官网下载的源码,这里可以下载
GnuPG(LTS)
。下载至本地后对其进行解压,进入文件夹,使用命令
./configure
,进行依赖检查。如依赖软件齐全,则可使用sudo make -j4 && make install
进行直接的安装。待过程结束后则安装完毕。若在
./configure
途中出现依赖缺失,则需要按照提醒安装依赖,依赖的源码在GnuPG官网下也有。结合我安装的时候的报错,我新安装的依赖有:- Libgpg-error
- libgcrypt(LTS)
- Libksba
- Libassuan
- nPth
依赖的源码下载解压后,在其文件夹下执行
./configure
以及sudo make -j4 && make install
即可完成依赖安装。
2、在Ubuntu-20.04 LTS上通过安装管理器安装
执行该命令安装
1 | sudo apt-get install gnupg |
三、使用
1、生成密钥
在终端中输入:
1 | gpg --full-gen-key |
将会见到
1 | gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc. |
中文翻译就是
1 | gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc. |
这里是需要选择密钥的种类(14那个选不了,不知啥玩意)。按下1,回车。
1 | RSA keys may be between 1024 and 4096 bits long. |
中文翻译
1 | RSA 密钥长度应在 1024 位与 4096 位之间。 |
这里我们就选择默认的的3072,直接回车。
1 | Requested keysize is 3072 bits |
对应
1 | 您所要求的密钥尺寸是 3072 位 |
如果要设计期限,输入对应数字以及选项,如3年,输入3y。
1 | Key expires at Mon Feb 24 19:03:14 2025 CST |
中途的y
是输入确认的,然后按照提醒输入名字,邮箱(最好和gitee、github上的登记邮箱一样)以及注释(可选)。
1 | You are using the 'utf-8' character set. |
字母O
确认输入信息是否正确。
接下来就是提醒要输入密码,TAB
选择下面选项:
如果输入密码太简单,会提醒你要不要换个强一点的
确认密码
密码输入完成后,显示:
1 | We need to generate a lot of random bytes. It is a good idea to perform |
翻译一下
1 | 我们需要生成很多随机字节。 执行是个好主意其他一些操作(在键盘上键入、移动鼠标、使用磁盘)在主要生成期间; 这给出了随机数 |
这里就生成好了,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 | cat >> ~/.gnupg/gpg.conf <<EOF |
缺少依赖Pinentry
体现为在创建GPG公钥的不能输密码,报错退出。
需要在GnuPG官网下载Pinentry
源码进行安装。
commit时遇到了GPG签名失败的错误
体现为输出
1 | error: gpg failed to sign the data |
解决方法为加入$(tty)
的变量
在~/.zshrc
加入export GPG_TTY=$(tty)
,然后source ~/.zshrc
。