ssl證書是什么東西


為什么需要證書

數字證書原理邏輯鏈條:

  1. 加密由加密算法 + 密鑰組成,加密算法公開,於是密鑰分發成了關鍵。(可以試想,若是加密算法私有,自然就沒有密鑰分發及之后的問題,代之就只加密算法本身的安全問題)
  2. 對稱加密密鑰不易分發,也不能每次都一樣
  3. 非對稱加密通信,客戶端持有服務端的公鑰,但服務商的公鑰誰都可以得到,服務商給我發的消息,別人雖然不能改,但也可以截獲並解密。
  4. 所以,純粹的對稱加密 和 非對稱加密 都是無法做到安全通信的。因此,先使用非對稱加密 約定一個對稱密鑰,再用對稱加密交流
  5. 問題就變成了:客戶端如何拿到服務商的公鑰? ==> 服務商的公鑰如何安全的在網絡上傳輸呢?==> 服務商不直接分發公鑰,而是分發經CA私鑰加密過的數字證書(包含公鑰+服務商域名等信息)。客戶端持有CA的公鑰,解密后拿到服務商的公鑰。

    從概念上來講,數字證書是用來驗證網絡通信參與者的一個文件。這和學校頒發 給學生的畢業證書類似。在學校和學生之間,學校是可信第三方 CA,而學生是通信 參與者。如果社會普遍信任一個學校的聲譽的話,那么這個學校頒發的畢業證書,也 會得到社會認可。參與者證書和 CA 證書可以類比畢業證和學校的辦學許可證。

  6. CA的公鑰如何安全的在網絡上傳輸呢?給CA 也頒發證書,然后大家都無條件信任root CA,在操作系統、瀏覽器發布的時候便嵌入了root CA。

就好比諜報戰里的接頭戲碼

  1. 兩個彼此認識的特工接頭會輕松一點,雙方可能會經常變換下接頭方式
  2. 第一次跟新來的特工接頭,上級會告訴你xx點去xx等一個手里拿着xx的人,接頭暗號是“hello/world”。此次,雙方都認識的上級是CA,“hello/world” 便是對方的CA證書。

證書

  1. 證書有什么,Chrome可以通過”settings ==> advanced setting ==> https/ssl ==> 管理證書” 查看證書內容。證書基本上是一個文本文件。

    • 服務商的公鑰
    • 服務商的信息
    • 對上述信息算一個簽名,用ca自己的私鑰加密一下
  2. 如何驗證證書?我擁有ca的公鑰,對證書上的信息做一個簽名, 解密證書上的簽名,比對。

    • 如果兩個簽名一樣,簽名一樣,說明證書沒被篡改
    • 簽名可以用ca公鑰正確解密,說明是用ca私鑰加密的,即證書是ca頒發的

    結論,證書是可信的,那么證書上的內容,尤其是服務商的公鑰是可信的。就好像,畢業證上學校公章是可信的,那么可以相信這個學生的學歷是可信的。

動態加載證書

大多數時候,本地只要有常用的ca根證書,即可驗證大部分服務商。證書被驗證可信后,瀏覽器或操作系統會將證書存儲在本地(證書有效期內),當用戶在瀏覽器中鍵入https地址時,直接開始同服務端商定對稱算法和密鑰,從而省去證書的獲取和驗證過程。

但是,當服務商證書不在Java 的 cacerts 文件中,或者無法通過ca證書鏈式推導,我們也可以手動添加。

  1. 12306之類的網站,證書基本可信,但不是向ca申請的
  2. 內部通信,證書自己生成,自己確認可信

添加方式

  1. 使用java keytool工具添加。有時候不具備權限,或要添加的機器過多
  2. 程序加載。這就是一些應用在使用時,要指定證書地址的緣故了。應用作為客戶端,直接加載服務端證書,以省去證書驗證過程。

證書的存儲

瀏覽器保存了一個常用的 CA 證書列表,與此類似的,操作系統也一樣保存有一份可信的證書列表。

證書的格式

CA 在發布證書時,常常使用 PEM 格式,這種格式的好處是純文本,內容是 BASE64 編碼的,另外還有比較常用的二進制 DER 格式,在 Windows 平台上較常使用的 PKCS#12 格式等等。當然,不同格式的證書之間是可以相互轉換的。

在 Java 平台下,證書常常被存儲在 KeyStore 文件中,上面說的 cacerts 文件就是一個 KeyStore 文件(KeyStore 只是一種文件格式,java中使用keyStore文件存儲加密相關的數據,證書是其中一種)。存儲在 KeyStore 文件中的對象有三種類型:Certificate、PrivateKey 和 SecretKey 。

  1. Certificate 就是證書,
  2. PrivateKey 是非對稱加密中的私鑰,
  3. 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)均可以使用這兩種編碼方式。

  1. *.pem - base64編碼
  2. *.der - 二進制編碼

基於OpenSSL自建CA和頒發SSL證書

假設自己的nginx 對外提供https支持

  1. 自建ca 或第三方ca 機構
  2. 在nginx 機器上 創建一對兒rsa密鑰(key文件);生成證書請求(csr文件)
  3. 將csr文件發送到ca服務器(第三方ca機構),得到nginx crt證書(crt或pem后綴)
  4. 訪問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設計到的一些加密知識

  1. 哈希,將任意長度的數據轉化為固定長度的,驗證數據是否被篡改
  2. 對稱加密,加密和解密使用同一個密鑰,對稱加密的優點是速度快,缺點是密鑰管理不方便,必須共享密鑰
  3. 非對稱加密,缺點是速度慢,優點是雙方無需共享同一個密鑰,密鑰管理很方便
  4. 數字證書,提供可信的服務商公鑰

其它

上文提到的都是單向非對稱加密,對於安全性很高的場景(比如網銀), 不僅客戶端要驗證服務端的合法性,服務端也要驗證每個訪問的客戶端的合法性,對於這種場景,往往給每個用戶發一個U盤,里面裝的就是客戶端的公鑰和私鑰對,用於雙向非對稱加密。

 

相關閱讀

SSL證書哪里買


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM