先来看 PGP 和 GPG 程序的介绍。
PGP
PGP(英语:Pretty Good Privacy,中文含义"良好隐私密码法")是一套用于消息加密、验证的应用程序
Phil Zimmermann 于 1991 年将 PGP 在互联网上免费发布。PGP 本身是商业应用程序;对应的开源软件为 GPG(GnuPG)。如今 PGP 软件属于 Symantec (赛门铁克公司) 公司。
PGP.cn PGP 中國:创建一个在中国可以让人信任的公钥发布/查询/下载网站,我们承诺,公钥发布/查询/下载的功能将永远免费。
GPG
GNU Privacy Guard (简称 GnuPG 或 GPG)也是一种加密软件,它是 PGP 加密软件的开源替代程序。GnuPG 是一个混合加密软件程序,可以使用多种非专利的算法。
安装
ubuntu 安装 gnupg:
|
|
Windows用户在官网下载安装程序安装。
默认配置文件:
默认的配置文件是
~/.gnupg/gpg.conf
和~/.gnupg/dirmngr.conf
.
创建密钥对
|
|
操作示例:
|
|
后续操作
|
|
用户ID
就是 uid ,比如上面输出的 uid Fan (github) <[email protected]>
而这里的 2DBA87CF
应该称作为:
密钥ID
KEY_ID
- 或者更确切的说,它是
MASTERKEYID
(主key id)。
另外还有 SUBKEYID。
用户邮箱
和MASTERKEYID
在一些场合可以相互替换,但不是全部场合(被这个坑过)。
- 用户名和电子邮件。可以给同样的密钥不同的身份,比如给同一个密钥关联多个电子邮件。
- 任何导入密钥的人都可以看到这里的用户名和电子邮件地址。
常用命令
查看公钥
|
|
|
|
注意 : 输出中可以看到是 .gnupg/pubring.gpg
文件中的内容。
查看私钥:
|
|
|
|
注意: 输出中可以看到是 .gnupg/secring.gpg
文件中的内容。
一些缩写介绍:
sec => 'SECret key'
ssb => 'Secret SuBkey'
pub => 'PUBlic key'
sub => 'public SUBkey'
下面的命令中的 MASTERKEYID
可以直接替换成邮箱地址。
生成和使用撤销证书
生成撤销证书
|
|
导出密钥并备份
可使用 -a
代替 --armor
,使用 -o
代替 --output
。
导出公钥:
gpg --armor --output public-key-gmail.txt --export MASTERKEYID
导出私钥:
gpg --armor --output secret-key-gmail.txt --export-secret-keys MASTERKEYID
编辑命令
gpg --edit-key MASTERKEYID
当运行编辑命令时,出现的几个标记的介绍:
Constant Character Explanation
─────────────────────────────────────────────────────
PUBKEY_USAGE_SIG S key is good for signing
PUBKEY_USAGE_CERT C key is good for certifying other signatures
PUBKEY_USAGE_ENC E key is good for encryption
PUBKEY_USAGE_AUTH A key is good for authentication
可以看到
- 最重要的主密钥显示:SC(“sign”&“certify”,代表可以签名和认证其它密钥)
- 第一个副密钥显示:E(“encrypt”,加密)
- 第二个副密钥显示:S(“sign”,签名)
具体操作见 将另一个电子邮件与您的 GPG 密钥相关联
将另一个电子邮件与您的 GPG 密钥相关联
将另一个电子邮件与您的 GPG 密钥相关联,示例:
|
|
GPG: Change email for key in PGP key servers (Example)
在您的 GPG 密钥中使用经过验证的电子邮件地址。如果您需要更新或添加电子邮件地址到您的 GPG 密钥,请参阅: Associating an email with your GPG key - GitHub Enterprise 2.10 Documentation
Github GPG + Keybase PGP - Ahmad Nassri
gpg key 用途
常见的两种用途: 加密、签名(利用公钥進行加密和签名)
- 對 Email 進行加密
- 加密一些文本信息,比如(註冊信息),使用 PGP 加密這些信息后可將加密后的密文發佈到自己的 Blog 上,什麼時候需要就取回密文進行解密。
- 簽名功能:可以利用 PGP 的簽名功能對你在網絡上的言論進行簽名,防止他人篡改你的原文。
对文字内容及文件进行加密、解密、签名的方法見該網站。 OpenPGP Symantec Encryption (PGP) Documentation 客户端/服务器架构。
在 GitHub 和 GitLab 中的使用
我们可以让Git使用gpg key对 提交或Tag进行签名
注意:在 GitHub 中使用的 gpg key 的邮件地址必须是经过 GitHub 认证过的邮箱地址 。
Your GPG key must be associated with a GitHub verified email that matches your committer identity.
设置 Signed commits
对单次提交进行签名,在提交时使用下面的命令:
|
|
为某个仓库或所有本地提交设置为签名提交:
-
首先需要找到你的 key id :
- 运行
gpg -K [email protected]
- 找到以
sec
开始的行 - 斜杠后面的十六进制数字是 key ID,比如
ABCD0123
- 运行
-
将你的 key ID 添加到git的全局配置文件
.gitconfig
:1 2 3 4
[user] name = you email = [email protected] signingkey = ABCD0123
或使用运行命令:
git config --global commit.gpgsign true
在 git 的全局配置文件中进行配置,这会导致所有提交都会进行签名。 -
将下面的内容添加到GPG 的配置文件
.gnupg/gpg.conf
中:use-agent no-tty
-
配置当前仓库中的所有提交默认都进行签名,打开仓库下的
.git/config
文件,添加如下内容:1 2
[commit] gpgsign = true
它和这个命令作用一样:
git config commit.gpgsign true
补充
与 SSH KEY 的关系是什么?
GitHub 中,使用 SSH 连接到 GitHub 时可以使用 ssh key来进行加密连接;而 gpg key 用于认证每次提交。
我的具体操作就是按照 Authenticating to GitHub 所说的方法进行设置。
其中有一步, 是要告诉 Git 你的 GPG key id 是多少,步骤如下:
# 使用此命令列出我的key id,顾名思义LONG 这种形式的id 比一般的id要长
$ gpg --list-secret-keys --keyid-format LONG
# 我的是 B28FACA42EBC87DF
# 将其写入git配置
$ git config --global user.signingkey B28FACA42EBC87DF
而后面的两个命令,列出的 2EBC87DF 也都是 key id,只是比上面的短:
$ gpg -K [email protected]
sec 4096R/2EBC87DF 2017-04-11
...
# 或使用命令
$ gpg --list-keys
sec 4096R/2EBC87DF 2017-04-11
Tips 小贴士:
To set all commits for a repository to be signed by default, in Git versions 2.0.0 and above, run
git config commit.gpgsign true
. To set all commits in any local repository on your computer to be signed by default, rungit config --global commit.gpgsign true
.To store your GPG key passphrase so you don’t have to enter it every time you sign a commit, we recommend using the following tools:
For Mac users, the GPG Suite allows you to store your GPG key passphrase in the Mac OS Keychain. For Windows users, the Gpg4win integrates with other Windows tools. You can also manually configure gpg-agent to save your GPG key passphrase, but this doesn’t integrate with Mac OS Keychain like ssh-agent and requires more setup.
gpg-agent
配置起来比较麻烦,这里只介绍,个人电脑个人用户的简单配置,在 gpg-agent.conf 文件中添加如下配置:
|
|
将以下行添加到 .bashrc
:
|
|
下面是具体的配置和解释;可以不看(感觉好啰嗦)。
1. 配置
提前备份的文件:
gpg-agent.conf 和 trustlist.txt(This is the list of trusted keys. You should backup this file.)
手动停止gpg-agent: gpgconf --kill gpg-agent
在配置文件~/.gnupg/gpg-agent.conf
中添加:
|
|
- Using the GNU Privacy Guard: Invoking GPG-AGENT,在此网站在下面的 “Option Index"列表中列出了一些信息。
- Using the GNU Privacy Guard: Agent Options 在这里查看配置文件中各配置的含义
ignore-cache-for-signing
(忽略所有缓存) This option will let gpg-agent bypass the passphrase cache for all signing operation. Note that there is also a per-session option to control this behavior but this command line option takes precedence.
2.重新加载 agent
更改配置后需要重新加载 agent。
|
|
该命令将会打印出 OK
3.pinentry
最后 agent 需要知道如何向用户索要密码,默认是使用一个 gtk dialog (gtk 对话框)。
在~/.gnupg/gpg-agent.conf
配置文件中,可以通过pinentry-program
配置你要采用的程序:
|
|
仍然需要重新加载 agent
4.Start gpg-agent with systemd user(可选)
这里使用的是 archlinux
Create a systemd unit file:
|
|
5.无人值守的密码短语(可选)
为了具有与旧版本相同类型的功能,必须完成两件事情:
-
edit the gpg-agent configuration to allow loopback pinentry mode:
1 2
# ~/.gnupg/gpg-agent.conf allow-loopback-pinentry
然后重启 gpg-agent,以生效。
-
需要更新应用程序,最好使用命令行加参数的形式,来使用环回模式,如下:
|
|
如果这样不行,则尝试在配置文件中添加相应配置项:
|
|
gpg --pinentry-mode loopback
命令不能执行,没有这个选项。后面的没有做了。配置了前面的已经可以了。
My PGP PUBLIC KEY
Fingerprint=683D ABB1 ABD1 6E7B 04A4 1284 6C98 8F2F 8B35 D6D7
学习资料
推荐的文章:
- GPG 入门教程
- Signing commits with GPG
- Pro Git:7.4 Git 工具-签署工作
- GnuPG (简体中文) - ArchWiki 推荐
- GnuPG 快速使用指南 - MWB 日常笔记 推荐。
- 二翔子的博客: 如何创建完美的 GPG 密钥对 文章中导出副密钥的语句有误。
- Creating a new GPG key with subkeys 推荐
- Creating the perfect GPG keypair - Alex Cabal 能够了解一些补充的概念。
- Subkeys - Debian Wiki 正解在这里。
- 使用 PGP 保护代码完整性(三):生成 PGP 子密钥
另参考: