說到GPG就必須先要說一下PGP(Pretty Good Privacy),它們都是OpenPGP標准的具體軟件實現。上世紀90年代初 Phil Zimmermann 開發了PGP,用以保護個人和商業機構數據的隱私,很快就受到了普遍的歡迎和采用。
但有一個問題,PGP是個商業軟件,據說價格還挺貴(我也沒買過,10來年前曾經用過一段時間破解版)。於是 GNU 組織依據 OpenPGP 標准開發了開源免費的 GPG,從此受到開源世界的普遍采用,尤其是類 Unix 系統平台。它的全名為 GnuPG(GNU Privacy Guard)。
由於基於相同的技術標准,所以在原理上這兩軟件是相同的,它們都是基於公鑰算法來實現數據的加密和身份驗證。公鑰算法即『非對稱算法』。一次數學運算,生成兩個密鑰,即公鑰和私鑰。公鑰加密的數據只有私鑰能解密,反之亦然。公鑰是發布出來給別人用的,因此不需要考慮機密性,誰獲得都行。而用公鑰加密的數據,只有對應的私鑰才能解密,因此私鑰的機密性是公鑰加密體系的根基,一旦私鑰泄漏,即無秘密可言。反過來私鑰的持有者,也可以用私鑰來加密數據發給他人,當數據接收者用對應的公鑰解密了數據,則反向證明數據一定來自於私鑰的持有者,因此私鑰加密數據的過程被稱為簽名,是對數據發送者身份的證明。
apt 包管理系統同樣采用了 GPG 加密驗證方式。Kali Linux 官方擁有自己的 GPG 公私鑰對,公鑰被其部署在每一個安裝了Kali Linux系統的計算機中。同時官方所有的更新包都使用自己的私鑰進行了簽名,客戶端會使用自己計算機中 Kali 官方的公鑰來對這個簽名進行驗證,以此來確保更新數據包確實來自於Kali官方,並且傳輸過程中沒有被篡改。
簡單來理解,公鑰和私鑰都是個密碼。但即使再復雜的密碼,如果用的時間足夠長的話,都有可能被破解(尤其是在這個量子計算飛速發展的時代)。因此每個公私鑰對在生成的時候,都要設置一個有效期,密鑰一旦過期,則被視為不再安全。通常密鑰有效期以年為時間單位,一般不超過 5 年。
這次 Kali 更新時的報錯信息就明確說明原因是密鑰過期,同時給出了過期密鑰的 ID。
其實我們可以運行下面的命令來查看系統里所有的密鑰信息:
apt-key list
輸出結果的最后一行就是導致這次問題的公鑰,到期時間是2018年2月2日(有效期大約是 6 年)。
既然是Kali官方的密鑰過期,那就需要 Kali 官方自己先更新一下,然后再把更新后的公鑰發給我們。其實這件事Kali官方已經做了,但作為 Kali 系統使用者的我們,也要更新一下自己電腦中的對應公鑰。
獲得新的公鑰可以有幾種方法,我們可以到Kali官方的密鑰下載站上自己下載,然后將下載的新公鑰導入自己系統。這個過程可以通過系統命令直接完成,也可以手動下載后,再使用系統命令導入密鑰。
我們也可以從GPG的密鑰發布服務器上下載Kali的新公鑰。是的,GPG 是有自己官方密鑰發布服務器的。作為一個受信的仲裁方,GPG 在全球提供大量的密鑰服務器,這些服務器之間會進行定期的數據同步,我們可以任選一個 GPG 密鑰服務器來下載密鑰。這些服務器也是我們用來驗證密鑰所有者的重要途徑。
具體更新方法有以下幾種方法:
(任選一種即可)
1、
apt-key adv --keyserver keys.gnupg.net --recv-keys ED444FF07D8D0BF6
2、
wget -q -O - archive.kali.org/archive-key.asc | apt-key add
3、
gpg --keyserver hkp://pgpkeys.mit.edu --recv-key ED444FF07D8D0BF6
gpg -a --export ED444FF07D8D0BF6 | sudo apt-key add -
4、
wget https://http.kali.org/kali/pool/main/k/kali-archive-keyring/kali-archive-keyring_2018.1_all.deb
apt install ./kali-archive-keyring_2018.1_all.deb
成功更新密鑰之后,我們就可以正常的 update / upgrade 了。
其實作為普通用戶,我們每個人都可以生成自己的 GPG 密鑰對,然后把公鑰發布到 GPG 官方服務器上。這樣的話,如果我要加密數據發送給你,就可以獲取並使用你的公鑰來進行加密,這樣加密的數據就只有你能解密,因為只有你才有自己的私鑰。
整個這個過程和證書加密的PKI架構非常相似。
注: 轉自苑房弘老師的公眾號 OG完美主義者