為什么需要證書
數字證書原理邏輯鏈條:
- 加密由加密算法 + 密鑰組成,加密算法公開,於是密鑰分發成了關鍵。(可以試想,若是加密算法私有,自然就沒有密鑰分發及之后的問題,代之就只加密算法本身的安全問題)
- 對稱加密密鑰不易分發,也不能每次都一樣
- 非對稱加密通信,客戶端持有服務端的公鑰,但服務商的公鑰誰都可以得到,服務商給我發的消息,別人雖然不能改,但也可以截獲並解密。
- 所以,純粹的對稱加密 和 非對稱加密 都是無法做到安全通信的。因此,先使用非對稱加密 約定一個對稱密鑰,再用對稱加密交流
-
問題就變成了:客戶端如何拿到服務商的公鑰? ==> 服務商的公鑰如何安全的在網絡上傳輸呢?==> 服務商不直接分發公鑰,而是分發經CA私鑰加密過的數字證書(包含公鑰+服務商域名等信息)。客戶端持有CA的公鑰,解密后拿到服務商的公鑰。
從概念上來講,數字證書是用來驗證網絡通信參與者的一個文件。這和學校頒發 給學生的畢業證書類似。在學校和學生之間,學校是可信第三方 CA,而學生是通信 參與者。如果社會普遍信任一個學校的聲譽的話,那么這個學校頒發的畢業證書,也 會得到社會認可。參與者證書和 CA 證書可以類比畢業證和學校的辦學許可證。
-
CA的公鑰如何安全的在網絡上傳輸呢?給CA 也頒發證書,然后大家都無條件信任root CA,在操作系統、瀏覽器發布的時候便嵌入了root CA。
就好比諜報戰里的接頭戲碼
- 兩個彼此認識的特工接頭會輕松一點,雙方可能會經常變換下接頭方式
- 第一次跟新來的特工接頭,上級會告訴你xx點去xx等一個手里拿着xx的人,接頭暗號是“hello/world”。此次,雙方都認識的上級是CA,“hello/world” 便是對方的CA證書。
證書
-
證書有什么,Chrome可以通過”settings ==> advanced setting ==> https/ssl ==> 管理證書” 查看證書內容。證書基本上是一個文本文件。
- 服務商的公鑰
- 服務商的信息
- 對上述信息算一個簽名,用ca自己的私鑰加密一下
-
如何驗證證書?我擁有ca的公鑰,對證書上的信息做一個簽名, 解密證書上的簽名,比對。
- 如果兩個簽名一樣,簽名一樣,說明證書沒被篡改
- 簽名可以用ca公鑰正確解密,說明是用ca私鑰加密的,即證書是ca頒發的
結論,證書是可信的,那么證書上的內容,尤其是服務商的公鑰是可信的。就好像,畢業證上學校公章是可信的,那么可以相信這個學生的學歷是可信的。
動態加載證書
大多數時候,本地只要有常用的ca根證書,即可驗證大部分服務商。證書被驗證可信后,瀏覽器或操作系統會將證書存儲在本地(證書有效期內),當用戶在瀏覽器中鍵入https地址時,直接開始同服務端商定對稱算法和密鑰,從而省去證書的獲取和驗證過程。
但是,當服務商證書不在Java 的 cacerts 文件中,或者無法通過ca證書鏈式推導,我們也可以手動添加。
- 12306之類的網站,證書基本可信,但不是向ca申請的
- 內部通信,證書自己生成,自己確認可信
添加方式
- 使用java keytool工具添加。有時候不具備權限,或要添加的機器過多
- 程序加載。這就是一些應用在使用時,要指定證書地址的緣故了。應用作為客戶端,直接加載服務端證書,以省去證書驗證過程。
證書的存儲
瀏覽器保存了一個常用的 CA 證書列表,與此類似的,操作系統也一樣保存有一份可信的證書列表。
證書的格式
CA 在發布證書時,常常使用 PEM 格式,這種格式的好處是純文本,內容是 BASE64 編碼的,另外還有比較常用的二進制 DER 格式,在 Windows 平台上較常使用的 PKCS#12 格式等等。當然,不同格式的證書之間是可以相互轉換的。
在 Java 平台下,證書常常被存儲在 KeyStore 文件中,上面說的 cacerts 文件就是一個 KeyStore 文件(KeyStore 只是一種文件格式,java中使用keyStore文件存儲加密相關的數據,證書是其中一種)。存儲在 KeyStore 文件中的對象有三種類型:Certificate、PrivateKey 和 SecretKey 。
- Certificate 就是證書,
- PrivateKey 是非對稱加密中的私鑰,
- SecretKey 用於對稱加密,是對稱加密中的密鑰。
KeyStore 文件根據用途,也有很多種不同的格式:JKS、JCEKS、PKCS12、DKS 等等。
java中的keyStore文件根據用途,分為兩類:keyStore、TrustStore,對應兩個類 KeyManager 和 TrustManager。前者負責管理自己的私鑰等數據,后者負責存儲一些可信任的證書。可以想見,如果我們改寫 TrustManager 類,讓其無論何時都返回true,即可繞過對證書的驗證。
制作證書
文件后綴 | 備注 | |
---|---|---|
證書簽名請求(Certificate signing request) | *.csr |
包含域名、國家、城市、公司、郵箱等信息 |
私鑰(Private Key) | *.key |
|
證書(Certificate) | *.cer ,*.crt |
CA 使用其私鑰對 csr簽名生成crt |
至於pem和der(少見)是編碼方式,以上三類(Cert,Key,CSR)均可以使用這兩種編碼方式。
*.pem
- base64編碼*.der
- 二進制編碼
基於OpenSSL自建CA和頒發SSL證書
假設自己的nginx 對外提供https支持
- 自建ca 或第三方ca 機構
- 在nginx 機器上 創建一對兒rsa密鑰(key文件);生成證書請求(csr文件)
- 將csr文件發送到ca服務器(第三方ca機構),得到nginx crt證書(crt或pem后綴)
- 訪問nginx 的客戶端持有ca 根crt證書,持有或獲取 nginx 的crt 證書,即可與nginx 進行https通訊。
ca和pki
所以呢,有一個PKI(Public Key Infrastructure)的概念,中文稱作公鑰基礎設施。它提供公鑰加密和數字簽名服務的系統或平台,比如ca系統,瀏覽器和操作系統內置一些常用ca證書。通過協議和機制的約定,實現公鑰的可信分發,進而建立起一個安全的網絡環境。而數字證書最常見的格式是 X.509 ,所以這種公鑰基礎設施又稱之為 PKIX 。
而在大公司內部,通常會建立私有的ca和pki體系。
安全應用
ssh
SSH原理與運用(一):遠程登錄
密碼登陸
如果嫌每次登陸輸密碼麻煩,可以公鑰登陸
https
SSL/TLS 四次握手
總結一下https設計到的一些加密知識
- 哈希,將任意長度的數據轉化為固定長度的,驗證數據是否被篡改
- 對稱加密,加密和解密使用同一個密鑰,對稱加密的優點是速度快,缺點是密鑰管理不方便,必須共享密鑰
- 非對稱加密,缺點是速度慢,優點是雙方無需共享同一個密鑰,密鑰管理很方便
- 數字證書,提供可信的服務商公鑰
其它
上文提到的都是單向非對稱加密,對於安全性很高的場景(比如網銀), 不僅客戶端要驗證服務端的合法性,服務端也要驗證每個訪問的客戶端的合法性,對於這種場景,往往給每個用戶發一個U盤,里面裝的就是客戶端的公鑰和私鑰對,用於雙向非對稱加密。
相關閱讀