先來看 PGP 和 GPG 程序的介紹。
PGP
PGP(英語:Pretty Good Privacy亡电,中文含義"良好隱私密碼法")是一套用于消息加密抄沮、驗證的應(yīng)用程序。
Phil Zimmermann 于 1991 年將 PGP 在互聯(lián)網(wǎng)上免費發(fā)布除抛。PGP 本身是商業(yè)應(yīng)用程序;對應(yīng)的開源軟件為 GPG(GnuPG)母截。如今 PGP 軟件屬于 Symantec (賽門鐵克公司) 公司到忽。
PGP.cn PGP 中國:創(chuàng)建一個在中國可以讓人信任的公鑰發(fā)布/查詢/下載網(wǎng)站,我們承諾清寇,公鑰發(fā)布/查詢/下載的功能將永遠免費喘漏。
GPG
GNU Privacy Guard (簡稱 GnuPG 或 GPG)也是一種加密軟件护蝶,它是 PGP 加密軟件的開源替代程序。GnuPG 是一個混合加密軟件程序翩迈,可以使用多種非專利的算法滓走。
首發(fā)于: GPG加密軟件的使用 – 就是這個范兒
安裝
ubuntu 安裝 gnupg:
$ sudo apt install gnupg
Windows用戶在官網(wǎng)下載安裝程序安裝。
默認配置文件:
默認的配置文件是
~/.gnupg/gpg.conf
和~/.gnupg/dirmngr.conf
.
創(chuàng)建密鑰對
$ gpg --gen-key
操作示例:
[fan 18:58:33]~$ gpg --gen-key
gpg (GnuPG) 1.4.20; Copyright (C) 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 密鑰長度應(yīng)在 1024 位與 4096 位之間搅方。
您想要用多大的密鑰尺寸?(2048) 4096
您所要求的密鑰尺寸是 4096 位
請設(shè)定這把密鑰的有效期限绽族。
0 = 密鑰永不過期
<n> = 密鑰在 n 天后過期
<n>w = 密鑰在 n 周后過期
<n>m = 密鑰在 n 月后過期
<n>y = 密鑰在 n 年后過期
密鑰的有效期限是姨涡?(0)
密鑰永遠不會過期
以上正確嗎?(y/n) y
您需要一個用戶標(biāo)識來辨識您的密鑰吧慢;本軟件會用真實姓名涛漂、注釋和電子郵件地址組合
成用戶標(biāo)識,如下所示:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
真實姓名: Fan
電子郵件地址: fan@qq.com
注釋: github
您選定了這個用戶標(biāo)識:
"Fan(github) <fan@qq.com>"
更改姓名(N)检诗、注釋(C)匈仗、電子郵件地址(E)或確定(O)/退出(Q)? O
您需要一個密碼來保護您的私鑰逢慌。
我們需要生成大量的隨機字節(jié)悠轩。這個時候您可以多做些瑣事(像是敲打鍵盤、移動
鼠標(biāo)攻泼、讀寫硬盤之類的)火架,這會讓隨機數(shù)字發(fā)生器有更好的機會獲得足夠的熵數(shù)。
....+++++
隨機字節(jié)不夠多忙菠。請再做一些其他的瑣事何鸡,以使操作系統(tǒng)能搜集到更多的熵!
(還需要184字節(jié))
+++++
我們需要生成大量的隨機字節(jié)牛欢。這個時候您可以多做些瑣事(像是敲打鍵盤骡男、移動
鼠標(biāo)、讀寫硬盤之類的)傍睹,這會讓隨機數(shù)字發(fā)生器有更好的機會獲得足夠的熵數(shù)隔盛。
隨機字節(jié)不夠多。請再做一些其他的瑣事焰望,以使操作系統(tǒng)能搜集到更多的熵骚亿!
(還需要231字節(jié))
...+++++
隨機字節(jié)不夠多已亥。請再做一些其他的瑣事熊赖,以使操作系統(tǒng)能搜集到更多的熵!
(還需要170字節(jié))
+++++
gpg: 密鑰 2DBA87CF 被標(biāo)記為絕對信任
公鑰和私鑰已經(jīng)生成并經(jīng)簽名虑椎。
gpg: 正在檢查信任度數(shù)據(jù)庫
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
后續(xù)操作
# 最好制作一張撤銷證書浆兰,用于密鑰作廢磕仅,請求外部公鑰服務(wù)器撤銷你的公鑰
# 這里 2DBA87CF 為我的 key id
gpg --gen-revoke 2DBA87CF
# 上傳公鑰到公共的公鑰服務(wù)器。
$ gpg --send-keys 2DBA87CF
# 任何人都可以用你的名義上傳公鑰所以我們可以
# 生成用于公布的公鑰指紋簸呈,然后進行公布榕订,比如我在文末公布了自己的公鑰指紋,好讓他人校驗
$ gpg --fingerpint 2DBA87CF
密鑰指紋 = 3C00 AC7B 3D06 E22E AEDE 72B0 B28F ACA4 2EBC 87DF
用戶ID
就是 uid 蜕便,比如上面輸出的 uid Fan (github) <fan@qq.com>
而這里的 2DBA87CF
應(yīng)該稱作為:
密鑰ID
KEY_ID
- 或者更確切的說劫恒,它是
MASTERKEYID
(主key id)。
另外還有 SUBKEYID轿腺。
用戶郵箱
和MASTERKEYID
在一些場合可以相互替換两嘴,但不是全部場合(被這個坑過)。
- 用戶名和電子郵件族壳°颈瑁可以給同樣的密鑰不同的身份,比如給同一個密鑰關(guān)聯(lián)多個電子郵件仿荆。
- 任何導(dǎo)入密鑰的人都可以看到這里的用戶名和電子郵件地址螺垢。
常用命令
查看公鑰
$ 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
文件中的內(nèi)容赖歌。
查看私鑰:
$ 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
文件中的內(nèi)容枉圃。
一些縮寫介紹:
sec => 'SECret key'
ssb => 'Secret SuBkey'
pub => 'PUBlic key'
sub => 'public SUBkey'
下面的命令中的 MASTERKEYID
可以直接替換成郵箱地址。
生成和使用撤銷證書
生成撤銷證書
# 二進制證書 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
導(dǎo)出密鑰并備份
可使用 -a
代替 --armor
孽亲,使用 -o
代替 --output
。
導(dǎo)出公鑰:
gpg --armor --output public-key-gmail.txt --export MASTERKEYID
導(dǎo)出私鑰:
gpg --armor --output secret-key-gmail.txt --export-secret-keys MASTERKEYID
編輯命令
gpg --edit-key MASTERKEYID
當(dāng)運行編輯命令時展父,出現(xiàn)的幾個標(biāo)記的介紹:
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 密鑰相關(guān)聯(lián)
將另一個電子郵件與您的 GPG 密鑰相關(guān)聯(lián)
將另一個電子郵件與您的 GPG 密鑰相關(guān)聯(lián)预皇,示例:
$ gpg --edit-key <key-id>
gpg> adduid
Real Name: <name>
Email address: <email>
Comment: <comment or Return to none>
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
Enter passphrase: <password>
gpg> uid <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 <key-id>
GPG: Change email for key in PGP key servers (Example)
在您的 GPG 密鑰中使用經(jīng)過驗證的電子郵件地址乳讥。如果您需要更新或添加電子郵件地址到您的 GPG 密鑰,請參閱:
Associating an email with your GPG key - GitHub Enterprise 2.10 Documentation
Github GPG + Keybase PGP - Ahmad Nassri
gpg key 用途
常見的兩種用途: 加密、簽名(利用公鑰進行加密和簽名)
- 對 Email 進行加密
- 加密一些文本信息治唤,比如(註冊信息),使用 PGP 加密這些信息后可將加密后的密文發(fā)佈到自己的 Blog 上,什麼時候需要就取回密文進行解密。
- 簽名功能:可以利用 PGP 的簽名功能對你在網(wǎng)絡(luò)上的言論進行簽名犬钢,防止他人篡改你的原文。
對文字內(nèi)容及文件進行加密思灰、解密玷犹、簽名的方法見該網(wǎng)站。
OpenPGP
Symantec Encryption (PGP) Documentation 客戶端/服務(wù)器架構(gòu)洒疚。
在 GitHub 和 GitLab 中的使用
我們可以讓Git使用gpg key對 提交或Tag進行簽名
注意:在 GitHub 中使用的 gpg key 的郵件地址必須是經(jīng)過 GitHub 認證過的郵箱地址 歹颓。
Your GPG key must be associated with a GitHub verified email that matches your committer identity.
設(shè)置 Signed commits
對單次提交進行簽名,在提交時使用下面的命令:
# -S選項表示對此次提交使用gpg進行簽名
git commit -S -m "提交信息"
為某個倉庫或所有本地提交設(shè)置為簽名提交:
-
首先需要找到你的 key id :
- 運行
gpg -K you@example.com
- 找到以
sec
開始的行 - 斜杠后面的十六進制數(shù)字是 key ID油湖,比如
ABCD0123
- 運行
-
將你的 key ID 添加到git的全局配置文件
.gitconfig
:[user] name = you email = you@example.com signingkey = ABCD0123
或使用運行命令:
git config --global commit.gpgsign true
在 git 的全局配置文件中進行配置晴股,這會導(dǎo)致所有提交都會進行簽名。 -
將下面的內(nèi)容添加到GPG 的配置文件
.gnupg/gpg.conf
中:use-agent no-tty
-
配置當(dāng)前倉庫中的所有提交默認都進行簽名肺魁,打開倉庫下的
.git/config
文件电湘,添加如下內(nèi)容:[commit] gpgsign = true
它和這個命令作用一樣:
git config commit.gpgsign true
補充
與 SSH KEY 的關(guān)系是什么?
GitHub 中鹅经,使用 SSH 連接到 GitHub 時可以使用 ssh key來進行加密連接寂呛;而 gpg key 用于認證每次提交。
我的具體操作就是按照 Authenticating to GitHub 所說的方法進行設(shè)置瘾晃。
其中有一步贷痪, 是要告訴 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 fan@qq.com
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 文件中添加如下配置:
# 8小時:28800 偶洋, 12小時:43200 熟吏, 24小時 :86400 7天:604800
# 設(shè)置緩存的有效時間,默認為600秒
default-cache-ttl 604800
# 最大緩存時間
max-cache-ttl 604800
# 無人值守密碼
allow-loopback-pinentry
將以下行添加到 .bashrc
:
export GPG_TTY=$(tty)
下面是具體的配置和解釋玄窝;可以不看(感覺好啰嗦)牵寺。
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
中添加:
# 3600 = 60秒 × 60分鐘 設(shè)置緩存的有效時間,默認為600秒恩脂。每次訪問都重新開始計時帽氓,前提是沒有超出最大緩存時間,該時間通過 max-cache-ttl設(shè)置默認為2小時
default-cache-ttl 3600
- Using the GNU Privacy Guard: Invoking GPG-AGENT俩块,在此網(wǎng)站在下面的 "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浓领。
$ 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嫉鲸,以生效。
需要更新應(yīng)用程序歹啼,最好使用命令行加參數(shù)的形式玄渗,來使用環(huán)回模式,如下:
$ gpg --pinentry-mode loopback
如果這樣不行狸眼,則嘗試在配置文件中添加相應(yīng)配置項:
# ~/.gnupg/gpg.conf
pinentry-mode loopback
gpg --pinentry-mode loopback
命令不能執(zhí)行藤树,沒有這個選項。后面的沒有做了拓萌。配置了前面的已經(jīng)可以了岁钓。
My PGP PUBLIC KEY
Fingerprint=683D ABB1 ABD1 6E7B 04A4 1284 6C98 8F2F 8B35 D6D7
學(xué)習(xí)資料
推薦的文章:
- GPG 入門教程
- Signing commits with GPG
- Pro Git:7.4 Git 工具-簽署工作
- GnuPG (簡體中文) - ArchWiki 推薦
- GnuPG 快速使用指南 - MWB 日常筆記 推薦。
- 二翔子的博客: 如何創(chuàng)建完美的 GPG 密鑰對 文章中導(dǎo)出副密鑰的語句有誤微王。
- Creating a new GPG key with subkeys 推薦
- Creating the perfect GPG keypair - Alex Cabal 能夠了解一些補充的概念屡限。
- Subkeys - Debian Wiki 正解在這里。
- 使用 PGP 保護代碼完整性(三):生成 PGP 子密鑰
另參考: