GPG密鑰的生成與使用

先來看 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 是一個混合加密軟件程序翩迈,可以使用多種非專利的算法滓走。

image

首發(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

Signed commits

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.

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.conftrustlist.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

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.無人值守的密碼短語(可選)

為了具有與舊版本相同類型的功能壮啊,必須完成兩件事情:

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

    # ~/.gnupg/gpg-agent.conf
    allow-loopback-pinentry
    

    然后重啟 gpg-agent嫉鲸,以生效。

  2. 需要更新應(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í)資料

推薦的文章:

另參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炕倘,一起剝皮案震驚了整個濱河市钧大,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罩旋,老刑警劉巖啊央,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涨醋,居然都是意外死亡瓜饥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門浴骂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來压固,“玉大人,你說我怎么就攤上這事靠闭≌饰遥” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵愧膀,是天一觀的道長拦键。 經(jīng)常有香客問我,道長檩淋,這世上最難降的妖魔是什么芬为? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任萄金,我火速辦了婚禮,結(jié)果婚禮上媚朦,老公的妹妹穿的比我還像新娘氧敢。我一直安慰自己,他們只是感情好询张,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布孙乖。 她就那樣靜靜地躺著,像睡著了一般份氧。 火紅的嫁衣襯著肌膚如雪唯袄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天蜗帜,我揣著相機與錄音恋拷,去河邊找鬼。 笑死厅缺,一個胖子當(dāng)著我的面吹牛蔬顾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播湘捎,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阎抒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了消痛?” 一聲冷哼從身側(cè)響起且叁,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秩伞,沒想到半個月后逞带,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡纱新,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年展氓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脸爱。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡遇汞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出簿废,到底是詐尸還是另有隱情空入,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布族檬,位于F島的核電站歪赢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏单料。R本人自食惡果不足惜埋凯,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一点楼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧白对,春花似錦掠廓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至媳拴,卻和暖如春黄橘,著一層夾襖步出監(jiān)牢的瞬間兆览,已是汗流浹背屈溉。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抬探,地道東北人子巾。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像小压,于是被迫代替她去往敵國和親线梗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 有必要先來了解什么是SSH和什么是SSH key怠益。 SSH Secure Shell (SSH) 是一個允許兩臺電...
    faner閱讀 47,326評論 1 48
  • 加密那點事 誰都會有一些不想讓其他人知道的東西仪搔,銀行卡密碼、網(wǎng)絡(luò)登錄帳號密碼蜻牢、郵件系統(tǒng)密碼烤咧、寫滿了青澀回憶的日記等...
    麥滿屯閱讀 4,035評論 1 15
  • 我們平時都聽過非對稱加密,公鑰和私鑰抢呆,簽名驗證煮嫌,但這些證書都是怎么得到的呢?本篇文章會解答這些問題抱虐。 背景介紹 加...
    老馬的春天閱讀 8,888評論 2 12
  • GPG簡介 在GPG工具出現(xiàn)之前昌阿,有一個PGP的加密工具(收費),后來由GNU組織開發(fā)出了一個新的PGP替代產(chǎn)品恳邀,...
    若兮緣閱讀 1,191評論 0 9
  • 功能 GPG 是加密和數(shù)字簽名的免費工具懦冰,大多用于加密信息的傳遞。 除了僅用密碼加密外谣沸, GPG 最大的不同是提供...
    QuietHeart閱讀 963評論 0 3