GPG 的日常應用
GPG(GNU Privacy Guard) 是一款常用的安全工具,也是最爲知名的 PGP(Pretty Good Privacy) 開源實現。GPG 的應用場景非常豐富,筆者曾經寫過幾篇文章介紹其功能及用法,但內容過於雜亂零散,於是便彙總成本篇希望更加系統的介紹其在日常中的應用。
值得注意的是 GPG 本身雖然功能豐富,但是卻因爲其結構複雜、標準更新速度慢、歷史遺留問題盤根錯節等原因被人詬病,比如這篇文章 就詳細介紹了其問題和替代產品。不過本文並不去討論這些安全問題,每個人對於安全和隱私的保護需求不同,使用何種工具需要根據自己的需求進行判斷。而本文只會着重在 GPG 本身,這也意味着流暢閱讀本文可能需要讀者對安全、隱私、密碼學等內容有一定的瞭解。拋開安全性不談,功能衆多的 GPG 也屬於獨特的歷史產物,如今已不太可能會有類似的設計,更不必說完全的替代品了。而且 GPG 已經完成自己的使命,在不久的將來以何種方式落幕也說不定,瞭解 GPG 其實也是在瞭解這段傳奇的歷史。不過長期以來人們還是期望有一款工具能不那麼複雜並且替代 GPG 的核心安全功能,於是便有大佬不負衆望,對於加密工具的未來進行了展望並制定了 「age(上げ)」標準,大家現在可以很方便的使用他們的 Go 版本 age 或者 Rust 版本 rage,除此以外還有配套的 pass 替代品 passage 和相關的 YubiKey 插件,希望這些推薦能夠給諸位帶來幫助。
另外,如果想要瞭解更多關於在 YubiKey 上使用 GPG 的細節,可以查看這篇教程。同時,筆者也在下面列出了 GPG 和 Yubico 官方的文檔,不過裏面的一些內容已經有些過時了,筆者並不推薦。
- The GNU Privacy Handbook
- Gnu Privacy Guard (GnuPG) Mini Howto (English)
- How to use the Fellowship Smartcard
- Yubico PGP
言歸正傳,本文大體上會分爲兩個部分:首先是 GPG 本身的一些功能,包括如何生成、查看、添加、刪除密鑰,以及如何備份密鑰等等。然後便是使用 GPG Smart Card 來增加物理上的安全性,這裏會使用到 YubiKey。如果對具體章節感興趣也可以通過下面的目錄來跳轉到自己需要的內容,希望能對諸位看官有所幫助。
目錄
GPG 的基本功能
GPG 功能繁多,不過主要都是基於加密及身份驗證這兩大功能,但是在使用這些功能之前我們需要先生成 GPG 密鑰。
生成密鑰
$ gpg --expert --full-generate-key
如果是爲 YubiKey 生成密鑰則需要考慮其本身的限制,對於 YubiKey 5.2.3
及以上的版本,筆者建議選擇 (9) ECC and ECC
,接下來的
Elliptic Curve 如果不知道選什麼就推薦
(1) Curve 25519
,如果對運行效率沒有太高要求可以考慮
(5) NIST P-521
或者
(8) Brainpool P-512
。其餘內容就按照偏好填寫就好。對於稍微老舊的 YubiKey,因爲還不支持
ECC,筆者建議選擇 (1) RSA and RSA (default)
,然後長度輸入
4096
就可以了。
查看密鑰
當我們擁有 GPG 密鑰之後就可以通過以下命令查看密鑰:
$ gpg --list-keys
我們可以通過 []
中的內容來區分密鑰的作用,他們分別是:
E Encrypt
S Sign
C Certify
A Authentication
? Unknown capability
添加密鑰
很多文章都會推薦先生成一個密鑰作爲 Master Key 之後,再加入 Subkey 用於不同的使用場景,例如添加不同的 Subkey 分別用於 Signing、Encryption、Authentication。這樣的做法看似高級,實際上大多是爲了增加便利性,對安全性的影響還需要再具體分析。很多 GPG 的使用者都會公開自己的密鑰或者上傳到 Key Server 之類的地方,添加 Subkey 可以方便 Subkey 丟失或被破解之後通過 Master Key 及時更新,只要保障 Master Key 的安全性,這樣替換密鑰就比重新生成要方便許多。然而就安全性而言,還是重新生成密鑰風險更小,況且如果我們不使用類似 Key Server 的服務,添加 Subkey 的便利性也就微乎其微了。因此,我們需要根據使用需求思考添加密鑰是不是適合自己的選擇。
那麼如果我們需要添加密鑰的話應該怎麼做呢?首先進入密鑰編輯模式:
$ gpg --expert --edit-key [UID]
進入編輯模式之後輸入 addkey
來添加新的密鑰。
然後根據自己的需求來選擇就好。因爲 GPG 沒有生成 Authentication Key
的預設,所以這裏就用其來舉例。假設我們要添加一個 Authentication
Key,我們可以先選擇
(11) ECC (set your own capabilities)
,選擇之後我們可以看到:
...
Current allowed actions: Sign
...
這上面顯示的就是這個新添加的密鑰的功能,所以我們可以先選擇
S
來關閉 Sign 的功能,然後再選擇 A
來開啓
Authentication 的功能,最後選擇
Q
退出。其餘內容就按照偏好填寫就可以了。
刪除密鑰
當我們需要刪除不需要的密鑰時可以使用如下命令刪除 Secret Key 和 Public Key:
$ gpg --delete-secret-key [UID]
$ gpg --delete-key [UID]
如果想要同時刪除,則只需要如下命令就可以了:
$ gpg --delete-secret-and-public-keys [UID]
導出密鑰
當我們需要分享密鑰時就需要考慮導出 Public Key 的問題,導出方法如下:
$ gpg --export --armor [UID]
如果想導出 Private Key 則可以使用如下方法:
$ gpg --export-secret-keys --armor [UID]
導出 Private Key 一般是爲了備份密鑰,如果這是你想要瞭解的內容可以參考備份及恢復密鑰的內容。
導入密鑰
GPG 密鑰的很大一部分功能就是用來跟他人通訊,那麼當我們得到他人的 Public Key 或者想要導入之前導出的密鑰時,我們就可以使用導入功能:
$ gpg --import [Filename]
信任密鑰
當我們導入密鑰之後,可以設置對其的信任等級,從而更加方便用戶對密鑰的管理。具體方法如下:
$ gpg --edit-key [UID]
gpg> trust
接下來根據提示選擇對應的信任程度就可以了。
備份及恢復
除了瞭解 GPG 的諸多功能,對其進行備份也非常重要,若是遺忘備份或者沒有將密鑰全部備份可能會造成很大的損失。更多關於備份及恢復密鑰的部分可以參考這篇文章。通過運用上文提到的功能,我們就可以輕鬆實現 GPG 的備份及恢復。
在需要備份的時候,首先使用如下命令用來導出 ASCII 格式的備份:
$ gpg --armor --export > pgp-public-keys.asc
$ gpg --armor --export-secret-keys > pgp-private-keys.asc
$ gpg --export-ownertrust > pgp-ownertrust.asc
導出之後一定要將這三個文件存放到一個安全且穩定的地方,外界無法接觸的移動硬盤亦或者安全係數較高的電腦都是極佳的選擇。
當我們需要恢復備份時,只需要在這三個文件存放的路徑下運行如下命令:
$ gpg --import pgp-public-keys.asc
$ gpg --import pgp-private-keys.asc
$ gpg --import-ownertrust pgp-ownertrust.asc
這樣就完成了備份到恢復的全過程!是不是還挺簡單的?關鍵還是要養成一個良好的備份習慣(比如:定期備份、安全存放備份,等等),這樣我們才可以避免 GPG 使用過程中不必要的損失。除此以外,有能力的小夥伴應該多多向身邊的朋友推薦 GPG 或者上文提到的 age,這樣不僅可以提升日常生活中各種場景的安全係數,同時也為更加安全的網絡環境作出了一份貢獻。
GPG 和 Smart Card
如果想要進一步提升 GPG 的安全性,使用 Smart Card 就是必不可少的一環了。Smart Card 可以對密鑰進行一定的物理隔離,比單純將其存儲在電腦裏要安全不少。衆多製作 Smart Card 的廠商中 YubiKey 是使用最爲廣泛的一個,所以本文就使用 YubiKey 進行講解,其他品牌的產品使用方法也大同小異。
YubiKey 管理工具
雖然本文並不需要使用 YubiKey 的管理工具,但在開始配置之前還是先簡單介紹一下。這其中包括一個相對簡單的 YubiKey Manager 和一個相對複雜的 YubiKey Personalization,兩者都有 CLI 和 GUI 的選項。
如果選擇安裝 YubiKey Manager,需要記得在安裝後啓用
pcscd.service
,操作如下:
$ pacman -S yubikey-manager-qt
$ sudo systemctl enable pcscd
$ sudo systemctl start pcscd
選擇 YubiKey Personalization 的話則只需要:
$ pacman -S yubikey-personalization-gui
打開相應的程序就應該可以看到自己的 YubiKey 了,如果無法識別的話建議先重啓系統後再嘗試。
配置 YubiKey
接下來我們就可以先對 YubiKey 進行編輯和配置了:
$ gpg --card-edit
進入卡片編輯模式之後我們可以使用
help
命令來查看可以使用的命令。
有心的小夥伴可以在這個模式下更改卡片信息,比如所有人信息之類的。另外,通過
list
可以查看卡片的全部信息。
而我們最爲關注的是更改 YubiKey 的 PIN 碼。GPG 卡片中有兩個 PIN
碼,分別是在每次使用的時候輸入的 PIN
以及執行一些高權限操作時需要用到的 Admin PIN,除此之外還有一個 Reset
Code 可以用於將 PIN 重置。默認情況下,如果 PIN 輸錯三次,那 YubiKey
就會自動鎖死,屆時則需要使用 Admin PIN 或者 Reset Code 來解鎖。如果
Admin PIN
輸錯三次,那卡片上的全部訊息就會被自動清理掉。這些信息全部可以通過使用
list
之後查看
PIN retry counter
的部分來獲取,其中分別記錄着 PIN、Reset
Code 和 Admin PIN 的可嘗試次數。在最開始拿到 YubiKey 的時候,默認的
PIN 碼為 123456
而默認的 Admin PIN 為
12345678
,這樣的密碼顯然並不安全,所以我們就先從更改密碼開始。
首先,我們輸入 admin
來開啟管理員命令,接着我們輸入
passwd
並按照提示進行修改就可以了。
在 YubiKey 5.2.3 及以上的版本中,我們還可以開啓 KDF(Key Derived
Function)來提高其安全性。在介紹方法前需要先說明幾點:首先 KDF
只能在沒有密鑰導入進 YubiKey 的時候開啓;其次,KDF
開啓之後除非重置卡片,要不然是無法關閉的,因此如果有必須使用低版本 GPG
需求的人就不要開啓了,不然會導致輸入的 PIN 全部錯誤。開啓 KDF
的方法依然是先使用 admin
開啓管理員命令,然後使用
kdf-setup
就可以開啓了。
PIN 碼修改完畢之後,我們就可以正式將生成的 GPG 密鑰導入 YubiKey 了。
將密鑰導入 YubiKey
注意!將密鑰導入到 YubiKey 之前,一定要瞭解密鑰導入過程是單向的,一旦導入進 YubiKey 將無法再取出。同時電腦中的 Public Key 也應當及時備份,因爲要想從 YubiKey 上重新獲取異常繁瑣,如果不幸需要恢復請查看這篇文章。因此,請根據自己的情況進行備份等操作之後再嘗試將密鑰導入 YubiKey 之中。
瞭解完後果之後,我們就可以使用如下命令來編輯密鑰:
$ gpg --edit-key [UID]
如果使用舊版本的 GPG,則需要先輸入
toggle
後再進行操作,不過正確的操作應該是先升級 GPG
到最新版本。另外,被選中的密鑰前會顯示
*
作爲標識,每次導入密鑰時應該只選擇一個,因此在移動當前密鑰的時候要記得取消選擇上一個密鑰。
在操作的過程中,我們只需要將對應標記的密鑰放在 YubiKey
上相應的位置就可以了。在 YubiKey 5.2.3
及以上的版本中,有四個位置,分別代表
Authentication、Decryption、Signature、Attestation
這四個功能。這裏假設我們通過上文中密鑰生成的方法生成了一組密鑰,然後又添加了一個
Authentication Key,這樣我們就擁有了一個 Master Key,標記爲
[SC]
,以及兩個 Subkey,分別標記爲 [E]
和
[A]
。
- 首先我們要將 Master Key (也就是這裏面提到的 Primary Key)轉移到 YubiKey 上 Signature 的位置:
- 輸入
keytocard
-
在
Really move the primary key? (y/N)
的問題中選擇y
- 接着選擇
(1) Signature key
-
接下來我們要將第一個標記爲
[E]
的 Subkey 轉移進 YubiKey:
- 輸入
key 1
選擇第一個 Subkey - 重複上面動作輸入
keytocard
- 之後選擇
(2) Encryption key
-
最後我們需要將標記爲
[A]
的 Subkey 轉移到 YubiKey:
- 先再次輸入
key 1
來取消對第一個 Subkey 的選擇 - 接下來輸入
key 2
來選擇第二個 Subkey - 繼續重複上面動作輸入
keytocard
- 之後選擇
(3) Authentication key
- 接下來輸入
quit
並確認保存就大功告成啦~
此時如果我們使用
gpg --list-secret-keys
查看剛剛被移動的密鑰都有
>
的標記(例如 sec>
和
ssb>
),就說明導入成功了。
YubiKey 被鎖該怎麼辦?
如果因爲誤操作而導致 YubiKey 被鎖或者設置失敗,想從頭再來也無需着急,只需要運行如下命令就好(注意此步驟會刪除 YubiKey 上的一切 GPG 訊息,請認真判斷後使用,否則也只能後果自負了 ╮(╯_╰)╭):
$ gpg --edit-card
gpg/card> factory-reset
總結
希望本文能夠幫助諸位在日常生活中更好的使用 GPG。GPG 作為一個知名且使用廣泛的加密工具,無疑是具有傳奇色彩的。個人的安全與隱私不但是一種權利,更需要每個人來捍衛。使用加密工具如今也不單單是爲了保守祕密,更是捍衛自由的手段,GPG 無疑是個人加密自由的一個里程碑。筆者很慶幸能看到越來越多靠譜便捷的安全工具,但捍衛安全與自由任重道遠,衷心希望可以看到更多有能力的人為自由軟體社區貢獻力量,看到自由之花在更多領域開放。同時我們也該警醒那些對安全及自由的威脅。
Als die Nazis die Kommunisten holten,
habe ich geschwiegen;
ich war ja kein Kommunist.Als sie die Sozialdemokraten einsperrten,
habe ich geschwiegen;
ich war ja kein Sozialdemokrat.Als sie die Gewerkschafter holten,
habe ich nicht protestiert;
ich war ja kein Gewerkschafter.Als sie die Juden holten,
habe ich geschwiegen;
ich war ja kein Jude.Als sie mich holten,
gab es keinen mehr, der protestieren konnte.—— Friedrich Gustav Emil Martin Niemöller
我們應該牢記,追求自由不僅是為了自己,更是為了我們身邊的人,我們所愛的人。但願人們能夠銘記歷史教訓,願我們一起攜手向更好地未來邁進 (´,,•ω•,,)♡