GPG密钥的生成与使用

转载:faner
先来看PGP和GPG程序的介绍。

PGP
PGP(英语:Pretty Good Privacy,中文含义“良好隐私密码法”)是一套用于消息加密、验证的应用程序

Phil Zimmermann于1991年将PGP在互联网上免费发布。PGP本身是商业应用程序;对应的开源软件为GPG(GnuPG)。如今PGP软件属于 Symantec (赛门铁克公司) 公司。
image
PGP.cn PGP中國:创建一个在中国可以让人信任的公钥发布/查询/下载网站,我们承诺,公钥发布/查询/下载的功能将永远免费。

GPG
GNU Privacy Guard (简称GnuPG或GPG)是一种加密软件,它是PGP加密软件的开源替代程序。GnuPG是一个混合加密软件程序,可以使用多种非专利的算法。

安装
ubuntu安装gnupg:

$ sudo apt install gnupg
默认配置文件:

默认的配置文件是 ~/.gnupg/gpg.conf 和 ~/.gnupg/dirmngr.conf.

创建密钥对
$ gpg --gen-key
操作示例:

[fan 18:58:33]~$ gpg --gen-key
gpg (GnuPG) 1.4.20; Copyright © 2015 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.

请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
您的选择?
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048) 4096
您所要求的密钥尺寸是 4096 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
= 密钥在 n 天后过期
w = 密钥在 n 周后过期
m = 密钥在 n 月后过期
y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期
以上正确吗?(y/n) y

您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组合
成用户标识,如下所示:
“Heinrich Heine (Der Dichter) heinrichh@duesseldorf.de

真实姓名: Fan
电子邮件地址: fan@qq.com
注释: github
您选定了这个用户标识:
“Fan(github) fan@qq.com

更改姓名(N)、注释©、电子邮件地址(E)或确定(O)/退出(Q)? O
您需要一个密码来保护您的私钥。

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
…+++++

随机字节不够多。请再做一些其他的琐事,以使操作系统能搜集到更多的熵!
(还需要184字节)
+++++
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。

随机字节不够多。请再做一些其他的琐事,以使操作系统能搜集到更多的熵!
(还需要231字节)
…+++++

随机字节不够多。请再做一些其他的琐事,以使操作系统能搜集到更多的熵!
(还需要170字节)
+++++
gpg: 密钥 2DBA87CF 被标记为绝对信任
公钥和私钥已经生成并经签名。

gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性: 1 已签名: 0 信任度:0-,0q,0n,0m,0f,1u
pub 4096R/2DBA87CF 2017-04-11
密钥指纹 = 3C00 AC7B 3D06 E22E AEDE 72B0 B28F ACA4 2EBC 87DF
uid Fan (github) fan@qq.com
sub 4096R/873278A9 2017-04-11

gpg key已经生成

后续操作

列出密钥

[fan 19:24:44]~$ gpg --list-secret-keys --keyid-format LONG

最好制作一张撤销证书,用于密钥作废,请求外部公钥服务器撤销你的公钥

将二进制的公钥(私钥)导出为ASSCII码

上传公钥到公钥服务器。这里使用阮一峰的命令有一些问题,但可以正常工作

gpg --send-keys [用户ID]

生成用于公布的公钥指纹(用于他人校验)

gpg --fingerpint [用户ID]
密钥指纹 = 3C00 AC7B 3D06 E22E AEDE 72B0 B28F ACA4 2EBC 87DF
“用户ID"的Hash字符串,可以用来替代"用户ID”,比如这里gpg: 密钥 2EBC87DF 被标记为绝对信任的2EBC87DF 就是我的用户ID。
上面是阮一峰的博客中得到的结论;用户ID应该就是 uid ,比如上面输出的 uid Fan (github) fan@qq.com这才是指用户ID

而这里的 2DBA87CF 这应该是 密钥ID, KEY_ID,或者更确切的说,这里它是 主key id、MASTERKEYID。
另外还有 SUBKEYID。

用户邮箱 MASTERKEYID 在一些场合可以相互替换,但不是全部场合。被这个坑了。

用户名和电子邮件。可以给同样的密钥不同的身份,比如给同一个密钥关联多个电子邮件。
任何导入密钥的人都可以看到这里的用户名和电子邮件地址。
常用命令
查看公钥:
$ gpg --list-keys

$ gpg -k
[fan 15:50:59]~/.gnupg$ gpg -k
/home/fan/.gnupg/pubring.gpg # 公钥文件

pub 4096R/2DBA87CF 2017-04-11 # PUBlic key特征: 4096位,key id 和生成时间
uid Fan (for github) fan@qq.com # 用户ID
sub 4096R/873278A9 2017-04-11 # public SUBkey特征
注意: 输出中可以看到是 .gnupg/pubring.gpg 文件中的内容。

查看私钥:
$ gpg --list-secret-keys

$ gpg -K
[fan 15:35:25]~/.gnupg$ gpg -K
/home/fan/.gnupg/secring.gpg # 私钥文件

sec 4096R/2DBA87CF 2017-04-11
uid Fan (for github) fan@qq.com
ssb 4096R/873278A9 2017-04-11
注意: 输出中可以看到是 .gnupg/secring.gpg 文件中的内容。

一些缩写介绍:

sec => ‘SECret key’
ssb => ‘Secret SuBkey’
pub => ‘PUBlic key’
sub => ‘public SUBkey’
下面的命令中的[用户ID]都直接替换成 邮箱地址吧。

生成和使用撤销证书
生成撤销证书

二进制证书 revocation-gmail.cert; 但会提示 “已强行使用 ASCII 封装过的输出”

$ gpg --output revocation-gmail.cert --gen-revoke MASTERKEYID

-a (–armor)输出文件为 revocation-gmail-cert.txt 文本文件

$ gpg -a -o revocation-gmail-cert.txt --gen-revoke 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”,签名

对于Debian来说,签名密钥就足够了。

将另一个电子邮件与您的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密钥相关联,示例:

$ gpg --edit-key
gpg> adduid
Real Name:
Email address:
Comment:
Change (N)ame, ©omment, (E)mail or (O)kay/(Q)uit? O
Enter passphrase:
gpg> uid
gpg> trust
Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y
gpg> save
$ gpg --send-keys
gpg key用途
常见的两种用途: 加密、签名

PGP的一些作用:(利用公鑰進行加密和簽名)

對Email進行加密
加密一些文本信息,比如(註冊信息),使用PGP加密這些信息后可將加密后的密文發佈到自己的Blog上,什麼時候需要就取回密文進行解密。
簽名功能:可以利用PGP的簽名功能對你在網絡上的言論進行簽名,防止他人篡改你的原文(具體原理略)。
对文字内容及文件进行加密、解密、签名的方法見該網站。
OpenPGP
Symantec Encryption (PGP) Documentation 客户端/服务器架构。

1.加密
比如加密你的密码文件。

解密

2.签名
验证签名

在GitHub和GitLab中的使用
我的具体操作就是按照 Authenticating to GitHub 所说的方法进行设置。

其中有一步, 是要告诉Git你的GPG key id是多少,步骤如下:

使用此命令列出我的key id,顾名思义LONG 这种形式的id 比一般的id要长

$ gpg --list-secret-keys --keyid-format LONG

我的是 B28FACA42EBC87DF

$ git config --global user.signingkey B28FACA42EBC87DF
而后面的两个命令,列出的2EBC87DF也都是key id,只是比上面的短:

$ gpg -K fan@qq.com
sec 4096R/2EBC87DF 2017-04-11

或使用命令

$ gpg --list-keys
sec 4096R/2EBC87DF 2017-04-11
对提交签名和对Tag进行签名

GitHub中可以使用gpg key进行Signing commits using GPG和Signing Tags using GPG这两项操作。

注意:在GitHub中使用的gpg key的邮件地址必须是经过GitHub认证过的邮箱地址。
Your GPG key must be associated with a GitHub verified email that matches your committer identity.

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, run git 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.

设置 Signed commits
对单次提交进行签名: git commit -S -m “-S选项表示对此次提交使用gpg进行签名”

Signed commits · Wiki · akwizgran / briar · GitLab

好吧,原来上面的小贴士中也有相关方法。

Steps for enabling GPG signed commits in Android Studio:

Find the ID of your signing key
Rungpg -K you@example.com
Look at the line starting with sec。(找到以sec开始的行)
The hex digits after the slash are the key ID(斜杠后面的十六进制数字是key ID), e.g. ABCD0123
Add the key ID to your global .gitconfig:
[user]
name = you
email = you@example.com
signingkey = ABCD0123
Add the following lines to your .gnupg/gpg.conf:
use-agent
no-tty
Enable signed commits in the project’s .git/config: (对应于某个工程)
[commit]
gpgsign = true
和这个命令作用一样: git config commit.gpgsign true
也可尝试在git的全局配置文件中进行配置,以用于所有提交。也可以直接使用命令
git config --global commit.gpgsign true

GPG 的配置文件 .gnupg/gpg.conf

gpg-agent
GnuPG (简体中文) - ArchWiki 推荐

需要备份的文件:

gpg-agent.conf和trustlist.txt(This is the list of trusted keys. You should backup this file.)

配置起来比较麻烦,这里只介绍,个人电脑个人用户的简单配置。

Using the GNU Privacy Guard: Invoking GPG-AGENT,在此网站在下面的 “Option Index”列表中列出了一些信息。

手动停止: gpgconf --kill gpg-agent

您应该总是将以下行添加到.bashrc:

export GPG_TTY=$(tty)

  1. 配置
    在配置文件~/.gnupg/gpg-agent.conf中添加:

3600 = 60秒 × 60分钟 设置缓存的有效时间,默认为600秒。每次访问都重新开始计时,前提是没有超出最大缓存时间,该时间通过 max-cache-ttl设置默认为2小时

default-cache-ttl 3600
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.

一个示例:

5小时 24小时

default-cache-ttl 18000
max-cache-ttl 86400
ignore-cache-for-signing
2.重新加载agent
更改配置后需要重新加载agent。

$ gpg-connect-agent reloadagent /bye
该命令将会打印出 OK

3.pinentry
最后agent需要知道如何向用户索要密码,默认是使用一个 gtk dialog (gtk对话框)。

在~/.gnupg/gpg-agent.conf配置文件中,可以通过pinentry-program配置你要采用的程序:

PIN entry program

pinentry-program /usr/bin/pinentry-curses

pinentry-program /usr/bin/pinentry-qt

pinentry-program /usr/bin/pinentry-kwallet

pinentry-program /usr/bin/pinentry-gtk-2
仍然重新加载agent

4.Start gpg-agent with systemd user(可选)
这里使用的是 archlinux

Create a systemd unit file:

文件 ~/.config/systemd/user/gpg-agent.service 中

[Unit]
Description=GnuPG private key agent
IgnoreOnIsolate=true

[Service]
Type=forking
ExecStart=/usr/bin/gpg-agent --daemon
Restart=on-abort

[Install]
WantedBy=default.target
5.无人值守的密码短语(可选)
为了具有与旧版本相同类型的功能,必须完成两件事情:

edit the gpg-agent configuration to allow loopback pinentry mode:

~/.gnupg/gpg-agent.conf

allow-loopback-pinentry
然后重启 gpg-agent,以生效。

需要更新应用程序,最好使用命令行加参数的形式,来使用环回模式,如下:

$ gpg --pinentry-mode loopback
如果这样不行,则尝试在配置文件中添加相应配置项:

~/.gnupg/gpg.conf

pinentry-mode loopback
gpg --pinentry-mode loopback命令不能执行,没有这个选项。后面的没有做了。配置了前面的已经可以了。

  1. SSH agent (可选)
    如果你已经安装了GnuPG套件,你可能考虑使用gpg-agent去缓存你的SSH key。一些用户可能更喜欢GnuPG代理提供的PIN输入对话框,作为其密码短语管理的一部分。

My PGP PUBLIC KEY
Fingerprint=683D ABB1 ABD1 6E7B 04A4 1284 6C98 8F2F 8B35 D6D7

作者:faner
链接:https://www.jianshu.com/p/7f19ceacf57c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker GPG 密钥用于验证和加密 Docker 镜像和其他相关文件。您可以使用以下步骤生成 Docker GPG 密钥: 1. 首先,确保您已经安装了 GPG 工具。如果没有,请根据您的操作系统下载并安装 GPG。 2. 打开终端或命令提示符,并输入以下命令来生成新的 GPG 密钥对: ``` gpg --gen-key ``` 您将会被要求提供一些信息,例如您的姓名和电子邮件地址。 3. GPG 将会生成一个密钥对,包括一个公钥和一个私钥。请记住生成密钥使用的密码,因为您将需要在以后使用它。 4. 您可以使用以下命令列出您的 GPG 密钥对: ``` gpg --list-keys ``` 在列表中,您会看到一个带有 "pub" 字样的行,这是您的公钥。 5. 导出您的公钥,以便在 Docker 中使用使用以下命令导出公钥: ``` gpg --export -a "Your Name" > docker.gpg ``` 将 "Your Name" 替换为您在生成密钥使用的姓名。 6. 现在,您可以将 `docker.gpg` 文件复制到 Docker 守护程序的 `~/.docker` 目录中。 7. 在 Docker 配置文件 `~/.docker/config.json` 中添加以下内容,以告诉 Docker 使用 GPG 密钥: ``` { "credHelpers": { "gcr.io": "gcr", "eu.gcr.io": "gcr", "asia.gcr.io": "gcr", "staging-k8s.gcr.io": "gcr", "marketplace.gcr.io": "gcr" }, "experimental": "enabled", "gpgVerify": true } ``` 这将启用 GPG 密钥验证功能。 现在,您已经生成了 Docker GPG 密钥并配置了 Docker 使用它进行验证。请注意,这只是一种加强 Docker 安全性的方法之一,并且适用于需要保护 Docker 镜像和文件的特殊情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值