PKI與PGP
來自專欄 TLS與OpenSSL
PKI(public key infrastructure)代表的是一種組織架構,也是當前互聯網上通用的證書體系的名字。這個簡稱不代表某一種證書或者是某一種加密演算法,而是代表一種證書再互聯網上的完整應用方法。同級別的簡稱是PGP(確切的說PGP和PKI中的X.509格式的證書是同一個級別,由於證書是PKI系統的核心,所以統稱也可以),另外一種以驗證身份,加密傳和完整性檢查輸目的的組織架構,是分散式的。PKI相當於是集中式的。所以PKI中存在組織負責某一個環節的功能,而PGP更多的是一個P2P的通信方式,最早用於郵件應用中。
此處該有一個PKI體系圖
PKI的基礎設施中包括CA,RA,VA和客戶。
PGP是1991年由Phil Zimmermann 一個人開發的軟體,隨後由於太流行,形成標準(RFC 4880),對應的軟體套件是OpenPGP(還有GPG)。PGP使用的非對稱加密演算法是RSA,對稱加密演算法是IDEA(被設計用於取代DES的對稱加密演算法)。與PKI不同,PGP首先要解決的是點對點的通信問題,而點對點通信的最核心問題就是你在發送的時候,對方不一定在接收。例如TLS握手中,整個握手流程是立刻完成的,是一個同時在線的過程。而PGP在加密郵件的時候,寫郵件發送出來的時候,接收方並不會立刻回復,也不會立刻響應發送方的握手請求,也就註定了PGP是沒有握手的過程的。
當前世界的PKI體系
當前的國際上存在一整套PKI的現實體系。PKI中CA是整個PKI的核心,它負責接受用戶的證書請求,對證書進行實際的頒發製作。但是整個體系中,不能只有這樣一個核心功能,還需要考慮證書過期的銷毀問題,證書私鑰丟失的找回問題,用戶從哪裡下載到公鑰的資料庫。這一系列的功能都是整個證書系統的組件。即便如此,我們平時在說到現實中的PKI的時候,也大部分指的是CA,而CA並不只有一個。CA本身就是一個江湖。
任何一個企業都可以說自己是一個CA,甚至任何一個人都可以方便的用OpenSSL簽出一個根證書(Root CA),從而自己作為一個CA。雖然方法是公開的,也是非常容易操作的,但是一個個人想要成為一個被信任的CA幾乎是一件不可能的事情。這裡的關鍵就在於信任。如果一個個體能簽發一個根證書讓世界上大部分瀏覽器都默認安裝了這個證書(也就是信任這個證書),那麼這個個人就是一個可信任的企業級的CA。問題的關鍵就在這裡,個人不太可能做到讓各大通用的瀏覽器都默認安裝了你的根證書。所以問題的根本就在於瀏覽器承認誰了。
一個CA想要簽發的任何一個證書都必須要首先有一個自己的根證書。或者是代理上級CA的簽發,也就是使用了上級CA的根證書。比如GeoTrust是一個知名的CA,他有自己的根證書,他所簽出去的證書再證書鏈里的根證書都是GeoTrust全世界公開的根證書,也是默認安裝在瀏覽器裡面的根證書。也正是因為GeoTrust的根證書被瀏覽器信任(默認安裝了),所以GeoTrust才能作為一個商業級的CA存在,這也是為什麼伺服器在傳輸證書給客戶端的時候不需要傳根證書的原因,因為根證書已經被默認的安裝到了瀏覽器了。如果一個人想要做證書籤發的生意,但是又無法讓自己的根證書被瀏覽器信任,那麼他可以去招GeoTrust做代理,假設是A公司,那麼A公司的證書就會被加入到證書鏈中。最終發送到用戶的證書會是GeoTrust的證書(非根證書)+A公司的證書+伺服器的證書。這三級就組成了一個證書鏈。這是一個伺服器要發送給客戶端的內容。當然伺服器也可以只發送一個伺服器自己的證書,客戶端瀏覽器一般都支持自動下載的功能(也就是從PKI中的證書倉庫組件中下載),但是由於這些證書倉庫大都在國外,或者是網路帶寬不穩定,就會導致下載速度相對慢,服務不穩定。所以一般的伺服器都是直接發送除根證書之外的完整證書鏈給用戶。
證書鏈的主要大小就是取決於證書的層級,一個層級大概有2KB上下的大小增加,所以一個四級的證書就會有8KB(估算),那麼對於一個伺服器來說,要每次握手都發送這個8KB的證書到客戶端,如果是20k的RPS就會有160MB的帶寬,一個千兆的網卡都不夠。伺服器想要下發的主要內容是加密之後的實際數據,而不是證書,所以很多伺服器都希望減小證書的大小。通常而言ECC證書的大小遠小於RSA證書(但是性能不一定更好),所以ECC證書可能是一個未來發展的趨勢。世界上比較知名的CA大都是國外的,比如GlobalSign,NetworkSolutions,Symantec,Geotrust,RapidSSL等。這些CA無疑都是取得了各大瀏覽器的信任。瀏覽器信任他們也是有原因的,因為瀏覽器要位用戶負責,如果一個CA不小心簽出的證書被用於非法的用途,那麼這個CA的聲譽就會一落千丈。簡單的例子是加入一個CA高價賣給了一個黑產人員一個不屬於這個黑產人員域名的簽名證書,那麼這個黑產人員就可以使用這個證書來偽造這個域名,而瀏覽器就會完全的信任,因為證書信任鏈是實際存在的。這種事情,最後蒙受聲譽損失的是瀏覽器,所以瀏覽器會做好安全性把關,CA也就得十分的注重自己的安全性才能長期的生存。在信任鏈中,信任就代表了一切。
當一個公司要向一個CA申請證書的時候,他會依賴他自己的註冊信息去申請。例如賽門鐵克是一個知名CA服務商,當企業要去申請的時候,他會根據鄧白氏的企業註冊信息,找到企業的聯繫人信息,去人工的確認是否是真的由企業發起的。鄧白氏是全球頂級的企業信息服務公司,也是信任鏈中的重要一環。
目前國內的持牌CA企業也有三四十家了,這個持牌與國際的信任體系不太一樣。持牌是國家審批的企業,國際的信任企業是企業之間的授信行為。因為解決信任問題,國際上可能認為對企業的信任可以大於對政府的信任,而在國內政府可能是最高的信任機構。由於企業之間的守信是一個分散式的信任監督問題,國內中心分發的持牌守信就需要政府自己保證持牌CA的規範程度。
還有一個很重要的區別是國內的CA都支持生成符合國密標準的證書。國密的證書系統與國際通用的一個最顯著的不同是雙證書模型。另外一個證書的主要意義在於在國內通過的流量是可以被審查的。也就是說使用國際通行的單證書模型是可以防止中間人攻擊的,中間人在技術上是可以避免的。但是國密的標準是允許中間人的存在的,並且中間人只能是證書的頒發者。這樣就可以進行流量審查的操作了。
PGP的邏輯
最簡單的PGP邏輯是不需要體系的,由於PGP主要用於郵件中,我們以郵件通信為例來解說。
PGP有個前置條件,就是通信的雙方已經互相得到了對方的公鑰。也就是在通信之前,雙方必須要分別生成一個RSA密鑰對,然後分別把公鑰發送給對方。這個發送可以是公開的,不加密的(早期典型是上傳到BBS)。
當A給B發送郵件的時候,A首先對郵件的內容進行壓縮,這一步是為了增加加密的有效性。因為壓縮之後的字元是沒有統計學特點的,同時有一個節省大小的作用。A生成一個對稱加密的密鑰(IDEA),同時對郵件的正文進行哈希(MD5),然後把哈希的結果都放到郵件的內容中,使用對稱加密的密鑰進行加密。然後再使用B的公鑰對對稱加密的密鑰進行加密,與加密之後的正文一起發送給B。
B在收到郵件的時候,首先使用自己的私鑰對對稱加密的密鑰進行解密。再用得到的對稱加密的密鑰對郵件的正文進行解密,再進行解壓縮和哈希操作就能得到郵件的正文和完整性的確認。
可以看出來,整個過程巧妙的利用的非對稱加密和對稱加密同時對郵件進行加密來達到了安全通信的目的。理論上這種加密之後的結果,除了擁有RSA私鑰的雙方之外,任何人都不能解密,不能看到具體的內容。即使第三方拿到了完整的郵件內容,也無可奈何。之所以要同時使用對稱加密和非對稱加密,是因為非對稱加密的速度確實很慢,而郵件內容的大小又是不可控的。RSA之所以出現之後很長時間沒有大規模應用的原因就是速度過於緩慢,尤其是在20世紀的計算能力。由於郵件的時間不敏感,才能夠在那個時候使用離線版本的RSA。在1991年的時候,PGP一經發布就迅速的火起來,但是SSL在1995年出現的時候,作為一個伺服器端的特性,仍然沒辦法大規模推廣,主要原因也都是在計算能力上。事實上,TLS的最大規模推廣還是在2014年的時候蘋果強制推行TLS的時候,才在世界範圍上有了相對較大力度的推廣。性能上,不上TLS的Nginx可能達到20W RPS的並發,但是上了TLS,性能就會迅速衰落到萬級以下。幾十倍的成本換來潛在的安全性,是大部分企業都不會主動選擇的,除非被逼無奈。
由於PGP在通信之前的前提是拿到對方的公鑰,那麼這個公鑰如何正確的分發就是最大的問題了。假設從BBS上下載,也有可能下載到別人偽造的BBS。所以PGP開發了信任網路這個體系。這個信任網路就對應了PKI中的信任網路。這個信任網路仍然採用了去中心化的模型,也就是會存在非常多的信任網路,像我們的社交網路一樣。A信任B,C信任B,那麼B就可以作為A和C之間的信任中介。這就是信任網路的核心思想。
我們來看PGP的信任網路的思想特別類似於P2P的民間組織,也就是信任是由民間維護的。我要根B聊天,需要找C來介紹。在現實世界裡,這種權力下放的模型是基本上不會被廣泛採用的。因為一放就亂,民間的高手總是有層出不窮的使用方法,再加上民間新用戶太多,使用上很多標準又達不到,整個系統的存在就是一個不可控的混亂狀態,用信任系統的話說就是整個信任系統是不可預測的。
但是PGP的思路是好的,所以對PGP協議的改良演算法S/MIME就被提出來了,並且很快的被應用。S/MIME仍然使用和TLS類似的公網信任樹的結構,使用證書鏈,並且證書依然採用了X.509格式,只是根TLS使用的有點區別。也就是說S/MIME融合了TLS和PGP各自的長處,誕生的一種應用於郵件加密通信的協議。也是目前最廣泛應用的郵件加密協議。
推薦閱讀:
※密碼學I:流密碼基礎 - 定義及其應用
※菲律賓網站被「黑」中國紅客與外國黑客20年升級對抗賽
※同態加密——如何讓幫你幹活的人不知道自己都幹了些什麼
※使用C#實現文件加密、解密
※path-ORAM 及其他的tree-based ORAM