本文試圖以通俗易通的方式介紹https的工作原理,不糾結具體的術語,不考證嚴格的流程。我相信弄懂了原理之後,到了具體操作和實現的時候,方向就不會錯,然後條條大路通羅馬。閱讀文字需要提前大致了解對稱加密、非對稱加密、資訊認證等密碼學知識。如果你不太了解,可以閱讀erlang發明人joe armstrong最近寫的cryptography tutorial。大牛出品,通俗易懂,強力推薦。
客戶端。通常是瀏覽器(chrome、ie、firefox等),也可以自己編寫的各種語言的客戶端程式。
服務端。一般指支援https的**,比如github、支付寶。
ca(certificate authorities)機構。https證書簽發和管理機構,比如symantec、comodo、godaddy、globalsign。
下圖裡我畫出了這幾個角色:
認證正在訪問的**。什麼叫認證**?比如你正在訪問支付寶,怎樣確定你正在訪問的是阿里巴巴提供的支付寶而不是假冒偽劣的釣魚**呢?
保證所傳輸資料的私密性和完整性。眾所周知,http是明文傳輸的,所以處在同一網路中的其它使用者可以通過網路抓包來竊取和篡改資料報的內容,甚至運營商或者wifi提供者,有可能會篡改http報文,新增廣告等資訊以達到盈利的目的。
這一節通過介紹https協議的工作流程,來說明https是如何達成自己的兩個目的的。下圖我畫出了https的工作流程,注意,這只是原理示意圖,並不是詳細的協議解析。
可以看到工作流程,基本分為三個階段:
認證伺服器。瀏覽器內建乙個受信任的ca機構列表,並儲存了這些ca機構的證書。第一階段伺服器會提供經ca機構認證頒發的伺服器證書,如果認證該伺服器證書的ca機構,存在於瀏覽器的受信任ca機構列表中,並且伺服器證書中的資訊與當前正在訪問的**(網域名稱等)一致,那麼瀏覽器就認為服務端是可信的,並從伺服器證書中取得伺服器公鑰,用於後續流程。否則,瀏覽器將提示使用者,根據使用者的選擇,決定是否繼續。當然,我們可以管理這個受信任ca機構列表,新增我們想要信任的ca機構,或者移除我們不信任的ca機構。
協商會話金鑰。客戶端在認證完伺服器,獲得伺服器的公鑰之後,利用該公鑰與伺服器進行加密通訊,協商出兩個會話金鑰,分別是用於加密客戶端往服務端傳送資料的客戶端會話金鑰,用於加密服務端往客戶端傳送資料的服務端會話金鑰。在已有伺服器公鑰,可以加密通訊的前提下,還要協商兩個對稱金鑰的原因,是因為非對稱加密相對複雜度更高,在資料傳輸過程中,使用對稱加密,可以節省計算資源。另外,會話金鑰是隨機生成,每次協商都會有不一樣的結果,所以安全性也比較高。
加密通訊。此時客戶端伺服器雙方都有了本次通訊的會話金鑰,之後傳輸的所有http資料,都通過會話金鑰加密。這樣網路上的其它使用者,將很難竊取和篡改客戶端和服務端之間傳輸的資料,從而保證了資料的私密性和完整性。
如果你是乙個伺服器開發者,想使用https來保護自己的服務和使用者資料安全,你可以按照以下流程來操作。
說是討論https,事實上https就是http跑在ssl或者tls上,所以本文討論的原理和流程其實是ssl和tls的流程,對於其它使用ssl或者tls的應用層協議,本文內容一樣有效。
本文只討論了客戶端驗證服務端,服務端也可以給客戶端頒發證書並驗證客戶端,做雙向驗證,但應用沒有那麼廣泛,原理類似。
由於採用了加密通訊,https無疑要比http更耗費伺服器資源,這也是很多公司明明支援https卻預設提供http的原因。
原文:
客戶端與伺服器介面的互動。
上面的 是設定與伺服器連線的,包括連線伺服器的方法,以及傳輸資料的格式,可編碼方式等。下面的 是處理伺服器的返回值的。try if a00000 equals resjson.get code else resultcode resjson.get code catch classcastexcep...
伺服器與客戶端
建立socket操作,建立流式套接字,返回套接字型大小socksrv socket socket int af,int type,int protocol 第乙個引數,指定位址簇 tcp ip只能是af inet,也可寫成pf inet socket socksrv socket af inet,s...
客戶端與伺服器
cs與bs 軟體使用方式上的兩種劃分 c s client server pc客戶端與伺服器架構 特點 在伺服器當中就主要是乙個資料庫,把所有業務邏輯都交給客戶端來完成 優點 較為安全,使用者介面豐富,客戶體驗好 缺點 每次公升級都要重新安裝,針對不同的作業系統開發,可移植性差 b sbrowser...