阿里-測試開發(fā)面經(jīng)(十一)
點擊藍字關注我們,獲取更多面經(jīng)



當我們使用 HTTP 協(xié)議時,傳輸?shù)臄?shù)據(jù)是不安全的,因為所有在客戶端和服務端往來的數(shù)據(jù)都是明文:
第三方可以獲取到真實數(shù)據(jù)
第三方可以篡改數(shù)據(jù)
第三方可以冒充服務端或客戶端
為了解決這些問題,需要在 HTTP 協(xié)議中加入一個安全機制,由此并產(chǎn)生了 HTTPS,我們可以認為 HTTPS = HTTP + TLS/SSL。TLS/SSL 的引入解決了安全問題,而上層應用協(xié)議還是 HTTP。
###歷史
SSL(Secure Sockets Layer)中文稱作“安全套接層”,TLS(Transport Layer Security),中文稱作“傳輸層安全協(xié)議”。
1994 年,網(wǎng)景(NetScape)公司設計了 SSL 1.0
1995 年,SSL 2.0,存在嚴重漏洞
1996 年,SSL 3.0,得到大規(guī)模應用
1999 年,IETF 對 SSL 進行標準化,發(fā)布了 TLS 1.0
2006 年和 2008 年,TLS 進行了兩次升級,分別為 TLS 1.1 和 TLS 1.2
在應用層,我們習慣將兩者并稱 TLS/SSL,因為它們設計大致相同,我們可以認為它們是同一個事物在不同歷史階段的名稱。
HTTPS 可以認為是 HTTP + TLS/SSL,所以我們只需要了解 TLS/SSL 原理即可。在進入原理之前,我們需要了解兩個基礎概念:數(shù)字證書、證書授權中心。
###證書與授權
數(shù)字證書(Digital Certificate)是用來證明公鑰(非對稱密鑰算法中用于加密的密鑰)所有者身份的。我們?nèi)巳硕伎梢宰约荷梢粋€公鑰,但是這個公鑰是否能代表是你的,這個認證的過程需要一個權威機構執(zhí)行,這個機構就是證書授權中心。
證書授權中心(Certificate Authority)負責證書頒發(fā)。CA 是行業(yè)內(nèi)信得過的組織機構,它具有權威性,由它頒發(fā)的證書大家都相信是可靠的。
###TLS/SSL 協(xié)議
由客戶端發(fā)起握手,告訴服務器客戶端支持的 TLS/SSL 版本、數(shù)據(jù)加密算法、以及一個隨機數(shù)
1.1. 服務端確認支持這個版本的 TLS/SSL、加密算法,并生成一個隨機數(shù)
1.2. 服務端將證書(帶公鑰)、服務端生成的隨機數(shù)返回給客戶端
客戶端檢查證書是否可信(和已有的 CA 列表對比,看是否是已有 CA 頒發(fā)的證書),并生成第三個隨機數(shù) PreMasterSecret
客戶端使用證書帶的公鑰將 PreMasterSecret 進行加密,并通過之前交換的數(shù)據(jù)生成一個 Hash 值,發(fā)送給服務端,請求變更編碼
3.1. 服務端校驗 Hash(確認不是假的客戶端),并使用自己證書的私鑰解密出 PreMasterSecret
3.2. 服務端根據(jù)之前的隨機數(shù)和約定的加密算法,生成用于加密后續(xù)傳輸數(shù)據(jù)的會話密鑰 SessionSecret
3.3. 服務端根據(jù)之前交換的數(shù)據(jù)生成一個 Hash 值,發(fā)送給客戶端,確認開始變更編碼
客戶端校驗 Hash (確認不是假的服務端),并生成會話密鑰
客戶端使用會話密鑰加密數(shù)據(jù),并發(fā)送給服務端
5.1. 服務端使用會話密鑰解密數(shù)據(jù),執(zhí)行業(yè)務邏輯后產(chǎn)生數(shù)據(jù)
5.2. 服務端使用會話密鑰加密數(shù)據(jù),返回給客戶端
客戶端使用會話密鑰解密數(shù)據(jù),完成一次和服務端的數(shù)據(jù)交換
在這個過程中,有幾個關鍵點:
前兩次的隨機數(shù)(客戶端隨機數(shù)、服務端隨機數(shù))是明文傳輸?shù)?/span>
非對稱密鑰算法只被使用了一次,即客戶端使用證書公鑰加密 PreMasterSecret,服務端使用證書私鑰解密出 PreMasterSecret
應用數(shù)據(jù)的傳輸使用的是對稱密鑰算法,客戶端/服務端都使用會話密鑰進行加/解密
在握手階段,安全與否的關鍵在于 PreMasterSecret 是否能夠被破解,雖然理論上通過 RSA 算法加密是比較安全的,但還是有破解的可能性。最安全的做法是不發(fā)送 PreMasterSecret,而是根據(jù)一系列參數(shù)由客戶端和服務端分別計算出 PreMasterSecret,這個算法就是迪菲-赫爾曼密鑰交換。
另外,TLS/SSL 不只適用于 HTTP 的安全問題,它也可以和其他應用層協(xié)議搭配使用。
###應用
通過上述介紹,我們得知使用 SSL/TLS 需要做如下準備:
數(shù)字證書:可以找權威的證書授權中心頒發(fā)證書(有付費的,也有免費的),也可以自己做 CA,然后自己給自己頒發(fā)證書
服務端使用證書,比如配置 NGINX 來使用
客戶端使用 SSL/TLS 協(xié)議和服務端進行通訊,如果是自己的 CA 頒發(fā)的證書,還需要在客戶端導入 CA 的根證書
下面我們針對自建 CA 做一個完整的示例(證書相關使用 Linux 的 openssl 命令,客戶端、服務端使用 Golang)。
####建立 CA
生成 CA 私鑰:openssl genrsa -out ca.key 2048
生成 CA 根證書:openssl req -new -x509 -days 3650-key ca.key -out ca.crt
####頒發(fā)證書
生成證書私鑰:openssl genrsa -out auto.pem 1024
生成證書公鑰:openssl rsa -in auto.pem -out auto.key
生成簽名請求:openssl req -new -key auto.pem -out auto.csr,其中的 Common Name 一定要填寫客戶端訪問時的域名,并且不能是 IP
CA 簽名(頒發(fā))證書:openssl x509 -req -sha256 -in auto.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out auto.crt
最終我們需要的就是公鑰 auto.key 以及證書 auto.crt。
####服務端使用證書
1http.ListenAndServeTLS(Auto.Server, "auto.crt", "auto.key", nil)
####客戶端發(fā)起請求
這里假設客戶端已經(jīng)獲得了服務端的證書。
getClient 根據(jù)傳入的 url 實參中協(xié)議部分返回適當?shù)?HTTP 客戶端.
其中載入了 CA 證書,原因就是因為我們自建的 CA 不在系統(tǒng)自帶的“受信任的根證書頒發(fā)機構”中。


1.scoped_ptr:這是最常用的智能指針,當你new一塊內(nèi)存后,把內(nèi)存地址交給scoped_ptr管理,這樣就不用顯式調用delete了,當離開作用于后,該內(nèi)存會被自動釋放,如
int* p = new int;
scoped_ptr<int> scoped_int_ptr(p);
注意:無須再delete p;這樣會double free。另外一個重要的點是:scoped_ptr不允許傳遞指針,即他的拷貝構造和賦值函數(shù)都是private的,不允許調用,所以你不能寫如下代碼
scoped_ptr<int> scoped_int_ptr2 = scoped_int_ptr; // 不允許
2.auto_ptr:它和scoped_ptr用法基本是一致的,但是它允許指針傳遞,拷貝構造和賦值函數(shù)允許調用,故名思意,當發(fā)生賦值時,原對象的指針會轉移給新對象,這時原對象的指針就為NULL了,不能再調用。所以,對指針要把握好,使用應謹慎。
3.shared_ptr:scoped_ptr一樣包裝了new操作符在堆上分配的動態(tài)對象,但它實現(xiàn)的是引用計數(shù)型的智能指針 ,可以被自由地拷貝和賦值,在任意的地方共享它,當沒有代碼使用(引用計數(shù)為0)它時才刪除被包裝的動態(tài)分配的對象。但是,shared_ptr注意不要有循環(huán)引用,否則會出現(xiàn)內(nèi)存泄漏。例如:A和B對象互相引用,它們的引用計數(shù)都是1,當出了作用域之后,二者不能自動釋放,出現(xiàn)了內(nèi)存泄漏。
4.weak_ptr:是一種智能指針,它對被 std::shared_ptr 管理的對象存在非擁有性(“弱”)引用。在訪問所引用的對象前必須先轉換為 std::shared_ptr。
std::weak_ptr 用來表達臨時所有權的概念:當某個對象只有存在時才需要被訪問,而且隨時可能被他人刪除時,可以使用std::weak_ptr 來跟蹤該對象。需要獲得臨時所有權時,則將其轉換為 std::shared_ptr,此時如果原來的std::shared_ptr 被銷毀,則該對象的生命期將被延長至這個臨時的 std::shared_ptr 同樣被銷毀為止。
更多面經(jīng)
掃描二維碼
獲取更多面經(jīng)
扶搖就業(yè)
