HTTPS除了使用CA機構頒發的數字證書外,有沒有使用數字簽名技術驗證內容的完整性?
伺服器端用私鑰加密內容後,有數字證書的驗證,是不是就沒有必要用數字簽名了?
先說結論:
1. 不存在不用數字簽名就能驗證的數字證書;
2. 當TLS- handshake完成後,payload的完整性用MAC+session key來保證,不是用數字簽名,更沒用到伺服器私鑰;
3. 如果通過用伺服器私鑰對payload簽名來保證Server發送至Client的payload完整性,那麼一定需要使用簽名驗證演算法來驗證其完整性。
=================下面對每項進行解釋======================================
1. 考慮使用證書做服務端驗證的SSL/TLS
證書上的內容會有
1. 服務提供方的公鑰 (Server的公鑰,此公鑰和Server私鑰是綁定的)
2. CA1對服務提供方公鑰的簽名, CA1的公鑰
3. CA2對CA1公鑰的簽名, CA2的公鑰
...
N. CA_N對CA_{N-1}的簽名,CA_N的公鑰
N+1. Root CA對CA_N公鑰的簽名
要驗證證書,就得用數字簽名演算法逐個驗證整個簽名鏈,
Root CA的公鑰會預裝在操作系統或者瀏覽器里。
2. 請看TLS的RFC https://tools.ietf.org/html/rfc5246
3.一個完整的數字簽名方案包括 (公私鑰對產生、簽名、驗簽)三個演算法數據完整性可以用數字簽名來保護,驗證收到的數據是否完整,需要使用驗簽演算法
HTTPS通信大體分兩個階段:1. 安全隧道的建立 2. 用戶數據安全傳輸
1 安全隧道的建立
一切安全的前提是以認證對方的合法性開始的,所以需要認證伺服器合法。
1.1 客戶端認證伺服器端
伺服器需要出示自己的數字證書,證書里有簽發者(Issuer)一欄,客戶端在本地預裝的數字證書庫里嘗試匹配簽發者,匹配到則用其公鑰來解密伺服器的數字簽名,如果可以解密,則認為伺服器合法;解密得到Digest,如果與本地計算的Digest一致則認為證書傳輸過程中沒有被篡改,於是客戶端擁有伺服器的公鑰,接下來的1.2基於RSA演算法的Key Exchange會使用此公鑰。
1.2 協商安全參數
此階段協商的安全參數用於階段2的用戶數據安全傳輸,使用RSA演算法或DH演算法來分享一個共同秘密secret,然後雙方獨立推導出(演算法相同,所以結果相同)
1.2.1 加密/解密 Key
1.2.2 HMAC Key
1.2.3 加密/解密演算法(對稱演算法)
AES,使用1.2.1
1.2.4 HMAC演算法
HMAC-SHA1,使用1.2.2
此過程很簡單,只是把1.2協商的安全套件拿來加密/解密,安全校驗,此過程不光要加密(數據機密性),同時還要使用HMAC,以此保證數據完整性。
僅僅要加密的話 是不需要CA的
數字簽名存在的一個意義就是讓客戶端能夠確認
「我訪問的目標真的是我要訪問的那個伺服器(而不是偽造的)」
這個時候就需要一個可信的第三方(信用機構CA)來證明了
首先你電腦上是預置了一些可信第三方的 「根」證書(預置「根」證書的來源由常操作系統和瀏覽器廠商保證)
你要訪問的伺服器去到這些第三方機構申請一個對應自己身份的證書 而這些第三方機構負責保證「這些證書不會被簽發給不應該的人或被重複簽發」(這點由CA的信用保證)
通過一些演算法 你的電腦會根據你電腦上預置的那些「根」證書來驗證伺服器端提供的這個證書是否來源於可信的機構
需要注意的是 「根」證書或證書不一定需要CA來簽發 只要伺服器端的證書能和客戶端的「根」證書對上號 那麼客戶端就會信任服務端。( 任何人都可以製造「根」證書和證書 但是別人不一定信任你)
整個體系中 下一級證書由上一級證書來保證其有效性 而這個塔的頂端---「根」證書是自己證明自己有效的
CA不過是他們的「根」證書被絕大多數操作系統和瀏覽器廠商承認(信任)就成為了CA
如果CA失信或出錯 那麼會對整個信用體系造成危害,這個時候 就有可能出現CA的「根」證書不被瀏覽器或操作系統信任的情況,這個CA也就基本上廢了
//本文僅僅是科普層面的,深度了解請閱讀相關資料
證書主要還是為了驗證伺服器,裡面用到數字簽名技術使用父級證書的公鑰驗簽,從而得到公鑰,與證書的公鑰對比一致驗證通過。信息的完整性理論上可以使用數字簽名進行對散列值簽名,目前標準協議還是使用MAC 技術來驗證信息的完整性。
https是通信加密。信息安全關注CIA指的是機密性,完整性,可用性,數字簽名是密碼學的一種應用,可以解決的是完整性和不可抵賴性的問題。驗證又是另外一直保證完整性的技術,不要把這些技術攪在一起。CA是Pki公鑰體系中的認證中心,是用來簽發證書的,證書的標準是X509。每一項技術都有它特定的術語和意義,要正確理解。
私匙就是用來簽名的,公匙才用來加密的。簽名只是加密了內容的hash,並附在內容之後,內容依然是公開的,用來表示是從正確的地方傳過來的,沒有中間人。公匙才是全部內容加密。還有就是只有在密匙交換時才使用非對稱加密,之後的包採用的是對稱加密,例如aes。
推薦閱讀:
※如何去分析開源的代碼,例如tomcat?
※RPC框架和簡單的request - reponse的web框架有什麼區別?
※JVM 常量池中存儲的是對象還是引用呢?
※jvm內存回收詭異現象,求解?
※JVM的JIT優化所帶來的性能提升與C++之類比較那個好?