數字證書原理邏輯鏈條:html
問題就變成了:客戶端如何拿到服務商的公鑰? ==> 服務商的公鑰如何安全的在網絡上傳輸呢?==> 服務商不直接分發公鑰,而是分發經CA私鑰加密過的數字證書(包含公鑰+服務商域名等信息)。客戶端持有CA的公鑰,解密後拿到服務商的公鑰。java
從概念上來說,數字證書是用來驗證網絡通訊參與者的一個文件。這和學校頒發 給學生的畢業證書相似。在學校和學生之間,學校是可信第三方 CA,而學生是通訊 參與者。若是社會廣泛信任一個學校的聲譽的話,那麼這個學校頒發的畢業證書,也 會獲得社會承認。參與者證書和 CA 證書能夠類比畢業證和學校的辦學許可證。nginx
CA的公鑰如何安全的在網絡上傳輸呢?給CA 也頒發證書,而後你們都無條件信任root CA,在操做系統、瀏覽器發佈的時候便嵌入了root CA。算法
就比如諜報戰裏的接頭戲碼瀏覽器
證書有什麼,Chrome能夠經過」settings ==> advanced setting ==> https/ssl ==> 管理證書」 查看證書內容。證書基本上是一個文本文件。安全
如何驗證證書?我擁有ca的公鑰,對證書上的信息作一個簽名, 解密證書上的簽名,比對。服務器
結論,證書是可信的,那麼證書上的內容,尤爲是服務商的公鑰是可信的。就好像,畢業證上學校公章是可信的,那麼能夠相信這個學生的學歷是可信的。網絡
大多數時候,本地只要有經常使用的ca根證書,便可驗證大部分服務商。證書被驗證可信後,瀏覽器或操做系統會將證書存儲在本地(證書有效期內),當用戶在瀏覽器中鍵入https地址時,直接開始同服務端商定對稱算法和密鑰,從而省去證書的獲取和驗證過程。ssh
可是,當服務商證書不在Java 的 cacerts 文件中,或者沒法經過ca證書鏈式推導,咱們也能夠手動添加。工具
添加方式
瀏覽器保存了一個經常使用的 CA 證書列表,與此相似的,操做系統也同樣保存有一份可信的證書列表。
證書的格式
CA 在發佈證書時,經常使用 PEM 格式,這種格式的好處是純文本,內容是 BASE64 編碼的,另外還有比較經常使用的二進制 DER 格式,在 Windows 平臺上較常使用的 PKCS#12 格式等等。固然,不一樣格式的證書之間是能夠相互轉換的。
在 Java 平臺下,證書經常被存儲在 KeyStore 文件中,上面說的 cacerts 文件就是一個 KeyStore 文件(KeyStore 只是一種文件格式,java中使用keyStore文件存儲加密相關的數據,證書是其中一種)。存儲在 KeyStore 文件中的對象有三種類型:Certificate、PrivateKey 和 SecretKey 。
KeyStore 文件根據用途,也有不少種不一樣的格式:JKS、JCEKS、PKCS十二、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支持
因此呢,有一個PKI(Public Key Infrastructure)的概念,中文稱做公鑰基礎設施。它提供公鑰加密和數字簽名服務的系統或平臺,好比ca系統,瀏覽器和操做系統內置一些經常使用ca證書。經過協議和機制的約定,實現公鑰的可信分發,進而創建起一個安全的網絡環境。而數字證書最多見的格式是 X.509 ,因此這種公鑰基礎設施又稱之爲 PKIX 。
而在大公司內部,一般會創建私有的ca和pki體系。
SSH原理與運用(一):遠程登陸
密碼登錄
若是嫌每次登錄輸密碼麻煩,能夠公鑰登錄
SSL/TLS 四次握手
總結一下https設計到的一些加密知識
上文提到的都是單向非對稱加密,對於安全性很高的場景(好比網銀), 不只客戶端要驗證服務端的合法性,服務端也要驗證每一個訪問的客戶端的合法性,對於這種場景,每每給每一個用戶發一個U盤,裏面裝的就是客戶端的公鑰和私鑰對,用於雙向非對稱加密。
相關閱讀