
為什么需要證書
數字證書原理邏輯鏈條:
- 加密由加密演算法 + 密鑰組成,加密演算法公開,于是密鑰分發成了關鍵,(可以試想,若是加密演算法私有,自然就沒有密鑰分發及之后的問題,代之就只加密演算法本身的安全問題)
- 對稱加密密鑰不易分發,也不能每次都一樣
- 非對稱加密通信,客戶端持有服務端的公鑰,但服務商的公鑰誰都可以得到,服務商給我發的訊息,別人雖然不能改,但也可以截獲并解密,
- 所以,純粹的對稱加密 和 非對稱加密 都是無法做到安全通信的,因此,先使用非對稱加密 約定一個對稱密鑰,再用對稱加密交流
-
問題就變成了:客戶端如何拿到服務商的公鑰? ==> 服務商的公鑰如何安全的在網路上傳輸呢?==> 服務商不直接分發公鑰,而是分發經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盤,里面裝的就是客戶端的公鑰和私鑰對,用于雙向非對稱加密,
相關閱讀
SSL證書哪里買
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10221.html
標籤:其他
上一篇:使用python遇到的問題
