【摘要】 為什麼浏覽器會提示網站“不安全”?從浏覽器的“不安全”提示來詳細了解https與SSL證書。我們打開很多http網站時候,會看到浏覽器提示“不安全”,而打開https網站卻沒有這個提示,這是為什麼呢?當使用者通路網站時遇到浏覽器展示“不安全”辨別,大部分的使用者将會提升警惕,甚至有人會認為這是一個不合法的站點,這對于企業網站影響更大,對于企業形象及網上業務開展都...
我們打開很多http網站時候,會看到浏覽器提示“不安全”,而打開https網站卻沒有這個提示,這是為什麼呢?當使用者通路網站時遇到浏覽器展示“不安全”辨別,大部分的使用者将會提升警惕,甚至有人會認為這是一個不合法的站點,這對于企業網站影響更大,對于企業形象及網上業務開展都有影響。可見,浏覽器對HTTP站點發出的“不安全”辨別将會大大降低用戶端的使用者體驗。

目前,解決網站的“不安全”辨別的最佳解決方案就是:适應時代潮流及安全需要,将網站整體遷移到HTTPS。與HTTP明文協定對比,HTTPS具備兩大網絡安全功能:加密以及身份驗證。要實作網站的https更新,就需要SSL證書,現在阿裡雲和騰訊雲都提供高安全級别的SSL證書,點選了解阿裡雲SSL證書;點選了解騰訊雲SSL證書。今天我們就來了解一下https與ssl證書。
HTTPS 解決了什麼問題
一個簡單的回答可能會是 HTTP 它不安全。由于 HTTP 天生明文傳輸的特性,在 HTTP 的傳輸過程中,任何人都有可能從中截獲、修改或者僞造請求發送,是以可以認為 HTTP 是不安全的;在 HTTP 的傳輸過程中不會驗證通信方的身份,是以 HTTP 資訊交換的雙方可能會遭到僞裝,也就是沒有使用者驗證;在 HTTP 的傳輸過程中,接收方和發送方并不會驗證封包的完整性,綜上,為了結局上述問題,HTTPS 應用而生。
你還記得 HTTP 是怎麼定義的嗎?HTTP 是一種 超文本傳輸協定(Hypertext Transfer Protocol) 協定,它 是一個在計算機世界裡專門在兩點之間傳輸文字、圖檔、音頻、視訊等超文本資料的約定和規範,那麼我們看一下 HTTPS 是如何定義的。
HTTPS 的全稱是 Hypertext Transfer Protocol Secure,它用來在計算機網絡上的兩個端系統之間進行安全的交換資訊(secure communication),它相當于在 HTTP 的基礎上加了一個 Secure 安全的詞眼,那麼我們可以給出一個 HTTPS 的定義:HTTPS 是一個在計算機世界裡專門在兩點之間安全的傳輸文字、圖檔、音頻、視訊等超文本資料的約定和規範。 HTTPS 是 HTTP 協定的一種擴充,它本身并不保傳輸的證安全性,那麼誰來保證安全性呢?在 HTTPS 中,使用傳輸層安全性(TLS)或安全套接字層(SSL)對通信協定進行加密。也就是 HTTP + SSL(TLS) = HTTPS。
HTTPS 協定提供了三個關鍵的名額
加密(Encryption), HTTPS 通過對資料加密來使其免受竊聽者對資料的監聽,這就意味着當使用者在浏覽網站時,沒有人能夠監聽他和網站之間的資訊交換,或者跟蹤使用者的活動,通路記錄等,進而竊取使用者資訊。
資料一緻性(Data integrity),資料在傳輸的過程中不會被竊聽者所修改,使用者發送的資料會完整的傳輸到服務端,保證使用者發的是什麼,伺服器接收的就是什麼。
身份認證(Authentication),是指确認對方的真實身份,也就是證明你是你(可以比作人臉識别),它可以防止中間人攻擊并建立使用者信任。
有了上面三個關鍵名額的保證,使用者就可以和伺服器進行安全的交換資訊了。那麼,既然你說了 HTTPS 的種種好處,那麼我怎麼知道網站是用 HTTPS 的還是 HTTP 的呢?給你兩幅圖應該就可以解釋了。
HTTPS 協定其實非常簡單,RFC 文檔很小,隻有短短的 7 頁,裡面規定了新的協定名,預設端口号443,至于其他的應答模式、封包結構、請求方法、URI、頭字段、連接配接管理等等都完全沿用 HTTP,沒有任何新的東西。
也就是說,除了協定名稱和預設端口号外(HTTP 預設端口 80),HTTPS 協定在文法、語義上和 HTTP 一樣,HTTP 有的,HTTPS 也照單全收。那麼,HTTPS 如何做到 HTTP 所不能做到的安全性呢?關鍵在于這個 S 也就是 SSL/TLS 。
TLS(Transport Layer Security) 是 SSL(Secure Socket Layer) 的後續版本,它們是用于在網際網路兩台計算機之間用于身份驗證和加密的一種協定。
我們都知道一些線上業務(比如線上支付)最重要的一個步驟是建立一個值得信賴的交易環境,能夠讓客戶安心的進行交易,SSL/TLS 就保證了這一點,SSL/TLS 通過将稱為 X.509 證書的數字文檔将網站和公司的實體資訊綁定到加密密鑰來進行工作。每一個密鑰對(key pairs) 都有一個 私有密鑰(private key) 和 公有密鑰(public key),私有密鑰是獨有的,一般位于伺服器上,用于解密由公共密鑰加密過的資訊;公有密鑰是公有的,與伺服器進行互動的每個人都可以持有公有密鑰,用公鑰加密的資訊隻能由私有密鑰來解密。
什麼是 X.509:X.509 是公開密鑰證書的标準格式,這個文檔将加密密鑰與(個人或組織)進行安全的關聯。X.509 主要應用如下:
SSL/TLS 和 HTTPS 用于經過身份驗證和加密的 Web 浏覽
通過 S/MIME 協定簽名和加密的電子郵件
代碼簽名:它指的是使用數字證書對軟體應用程式進行簽名以安全分發和安裝的過程。
通過使用由知名公共證書頒發機構(例如SSL.com)頒發的證書對軟體進行數字簽名,開發人員可以向最終使用者保證他們希望安裝的軟體是由已知且受信任的開發人員釋出;并且簽名後未被篡改或損害。
還可用于文檔簽名
還可用于用戶端認證
政府簽發的電子身份證
HTTPS 并不是一項新的應用層協定,隻是 HTTP 通信接口部分由 SSL 和 TLS 替代而已。通常情況下,HTTP 會先直接和 TCP 進行通信。在使用 SSL 的 HTTPS 後,則會先演變為和 SSL 進行通信,然後再由 SSL 和 TCP 進行通信。也就是說,HTTPS 就是身披了一層 SSL 的 HTTP。
SSL 是一個獨立的協定,不隻有 HTTP 可以使用,其他應用層協定也可以使用,比如 SMTP(電子郵件協定)、Telnet(遠端登入協定) 等都可以使用。
SSL 即安全套接字層,它在 OSI 七層網絡模型中處于第五層,SSL 在 1999 年被 IETF(網際網路工程組)更名為 TLS ,即傳輸安全層,直到現在,TLS 一共出現過三個版本,1.1、1.2 和 1.3 ,目前最廣泛使用的是 1.2,是以接下來的探讨都是基于 TLS 1.2 的版本上的。
TLS 用于兩個通信應用程式之間提供保密性和資料完整性。TLS 由記錄協定、握手協定、警告協定、變更密碼規範協定、擴充協定等幾個子協定組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術.
說了這麼半天,我們還沒有看到 TLS 的命名規範呢,下面舉一個 TLS 例子來看一下 TLS 的結構ECDHE-ECDSA-AES256-GCM-SHA384這是啥意思呢?我剛開始看也有點懵啊,但其實是有套路的,因為 TLS 的密碼套件比較規範,基本格式就是 密鑰交換算法 - 簽名算法 - 對稱加密算法 - 摘要算法 組成的一個密碼串,有時候還有分組模式,我們先來看一下剛剛是什麼意思.=。
使用 ECDHE 進行密鑰交換,使用 ECDSA 進行簽名和認證,然後使用 AES 作為對稱加密算法,密鑰的長度是 256 位,使用 GCM 作為分組模式,最後使用 SHA384 作為摘要算法。 TLS 在根本上使用對稱加密和 非對稱加密 兩種形式。對稱加密在了解對稱加密前,我們先來了解一下密碼學的東西,在密碼學中,有幾個概念:明文、密文、加密、解密。
明文(Plaintext),一般認為明文是有意義的字元或者比特集,或者是通過某種公開編碼就能獲得的消息。明文通常用 m 或 p 表示
密文(Ciphertext),對明文進行某種加密後就變成了密文
加密(Encrypt),把原始的資訊(明文)轉換為密文的資訊變換過程
解密(Decrypt),把已經加密的資訊恢複成明文的過程。
對稱加密(Symmetrical Encryption)顧名思義就是指加密和解密時使用的密鑰都是同樣的密鑰。隻要保證了密鑰的安全性,那麼整個通信過程也就是具有了機密性。
TLS 裡面有比較多的加密算法可供使用,比如 DES、3DES、AES、ChaCha20、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK 等。目前最常用的是 AES-128, AES-192、AES-256 和 ChaCha20。
DES 的全稱是 Data Encryption Standard(資料加密标準) ,它是用于數字資料加密的對稱密鑰算法。盡管其 56 位的短密鑰長度使它對于現代應用程式來說太不安全了,但它在加密技術的發展中具有很大的影響力。
3DES 是從原始資料加密标準(DES)衍生過來的加密算法,它在 90 年代後變得很重要,但是後面由于更加進階的算法出現,3DES 變得不再重要。
AES-128, AES-192 和 AES-256 都是屬于 AES ,AES 的全稱是Advanced Encryption Standard(進階加密标準),它是 DES 算法的替代者,安全強度很高,性能也很好,是應用最廣泛的對稱加密算法。
ChaCha20 是 Google 設計的另一種加密算法,密鑰長度固定為 256 位,純軟體運作性能要超過 AES,曾經在移動用戶端上比較流行,但 ARMv8 之後也加入了 AES 硬體優化,是以現在不再具有明顯的優勢,但仍然算得上是一個不錯算法。
加密分組對稱加密算法還有一個分組模式 的概念,對于 GCM 分組模式,隻有和 AES,CAMELLIA 和 ARIA 搭配使用,而 AES 顯然是最受歡迎和部署最廣泛的選擇,它可以讓算法用固定長度的密鑰加密任意長度的明文。
最早有 ECB、CBC、CFB、OFB 等幾種分組模式,但都陸續被發現有安全漏洞,是以現在基本都不怎麼用了。最新的分組模式被稱為 AEAD(Authenticated Encryption with Associated Data),在加密的同時增加了認證的功能,常用的是 GCM、CCM 和 Poly1305。
比如 ECDHE_ECDSA_AES128_GCM_SHA256 ,表示的是具有 128 位密鑰, AES256 将表示 256 位密鑰。GCM 表示具有 128 位塊的分組密碼的現代認證的關聯資料加密(AEAD)操作模式。
我們上面談到了對稱加密,對稱加密的加密方和解密方都使用同一個密鑰,也就是說,加密方必須對原始資料進行加密,然後再把密鑰交給解密方進行解密,然後才能解密資料,這就會造成什麼問題?這就好比《小兵張嘎》去送信(信已經被加密過),但是嘎子還拿着解密的密碼,那嘎子要是在途中被鬼子發現了,那這信可就是被完全的暴露了。是以,對稱加密存在風險。
非對稱加密非對稱加密(Asymmetrical Encryption) 也被稱為公鑰加密,相對于對稱加密來說,非對稱加密是一種新的改良加密方式。密鑰通過網絡傳輸交換,它能夠確定及時密鑰被攔截,也不會暴露資料資訊。非對稱加密中有兩個密鑰,一個是公鑰,一個是私鑰,公鑰進行加密,私鑰進行解密。公開密鑰可供任何人使用,私鑰隻有你自己能夠知道。
使用公鑰加密的文本隻能使用私鑰解密,同時,使用私鑰加密的文本也可以使用公鑰解密。公鑰不需要具有安全性,因為公鑰需要在網絡間進行傳輸,非對稱加密可以解決密鑰交換的問題。網站保管私鑰,在網上任意分發公鑰,你想要登入網站隻要用公鑰加密就行了,密文隻能由私鑰持有者才能解密。而黑客因為沒有私鑰,是以就無法破解密文。
非對稱加密算法的設計要比對稱算法難得多(我們不會探讨具體的加密方式),常見的比如 DH、DSA、RSA、ECC 等。
其中 RSA 加密算法是最重要的、最出名的一個了。例如 DHE_RSA_CAMELLIA128_GCM_SHA256。它的安全性基于 整數分解,使用兩個超大素數的乘積作為生成密鑰的材料,想要從公鑰推算出私鑰是非常困難的。
ECC(Elliptic Curve Cryptography)也是非對稱加密算法的一種,它基于橢圓曲線離散對數的數學難題,使用特定的曲線方程和基點生成公鑰和私鑰, ECDHE 用于密鑰交換,ECDSA 用于數字簽名。TLS 是使用對稱加密和非對稱加密 的混合加密方式來實作機密性。
混合加密RSA 的運算速度非常慢,而 AES 的加密速度比較快,而 TLS 正是使用了這種混合加密方式。在通信剛開始的時候使用非對稱算法,比如 RSA、ECDHE ,首先解決密鑰交換的問題。然後用随機數産生對稱算法使用的會話密鑰(session key),再用公鑰加密。對方拿到密文後用私鑰解密,取出會話密鑰。這樣,雙方就實作了對稱密鑰的安全交換。
現在我們使用混合加密的方式實作了機密性,是不是就能夠安全的傳輸資料了呢?還不夠,在機密性的基礎上還要加上完整性、身份認證的特性,才能實作真正的安全。而實作完整性的主要手段是 摘要算法(Digest Algorithm)。
摘要算法如何實作完整性呢?在 TLS 中,實作完整性的手段主要是 摘要算法(Digest Algorithm)。摘要算法你不清楚的話,MD5 你應該清楚,MD5的全稱是 Message Digest Algorithm 5,它是屬于密碼雜湊演算法(cryptographic hash algorithm)的一種,MD5 可用于從任意長度的字元串建立 128 位字元串值。盡管 MD5 存在不安全因素,但是仍然沿用至今。MD5 最常用于驗證檔案的完整性。但是,它還用于其他安全協定和應用程式中,例如 SSH、SSL 和 IPSec。一些應用程式通過向明文加鹽值或多次應用哈希函數來增強 MD5 算法。
什麼是加鹽?在密碼學中,鹽就是一項随機資料,用作哈希資料,密碼或密碼的單向函數的附加輸入。鹽用于保護存儲中的密碼。例如
什麼是單向?就是在說這種算法沒有密鑰可以進行解密,隻能進行單向加密,加密後的資料無法解密,不能逆推出原文。
我們再回到摘要算法的讨論上來,其實你可以把摘要算法了解成一種特殊的壓縮算法,它能夠把任意長度的資料壓縮成一種固定長度的字元串,這就好像是給資料加了一把鎖。
除了常用的 MD5 是加密算法外,SHA-1(Secure Hash Algorithm 1) 也是一種常用的加密算法,不過 SHA-1 也是不安全的加密算法,在 TLS 裡面被禁止使用。目前 TLS 推薦使用的是 SHA-1 的後繼者:SHA-2。
SHA-2 的全稱是Secure Hash Algorithm 2 ,它在 2001 年被推出,它在 SHA-1 的基礎上做了重大的修改,SHA-2 系列包含六個哈希函數,其摘要(哈希值)分别為 224、256、384 或 512 位:SHA-224, SHA-256, SHA-384, SHA-512。分别能夠生成 28 位元組、32 位元組、48 位元組、64 位元組的摘要。
有了 SHA-2 的保護,就能夠實作資料的完整性,哪怕你在檔案中改變一個标點符号,增加一個空格,生成的檔案摘要也會完全不同,不過 SHA-2 是基于明文的加密方式,還是不夠安全,那應該用什麼呢?
安全性更高的加密方式是使用 HMAC,在了解什麼是 HMAC 前,你需要先知道一下什麼是 MAC。
MAC 的全稱是message authentication code,它通過 MAC 算法從消息和密鑰生成,MAC 值允許驗證者(也擁有秘密密鑰)檢測到消息内容的任何更改,進而保護了消息的資料完整性。
HMAC 是 MAC 更進一步的拓展,它是使用 MAC 值 + Hash 值的組合方式,HMAC 的計算中可以使用任何加密哈希函數,例如 SHA-256 等。
現在我們又解決了完整性的問題,那麼就隻剩下一個問題了,那就是認證,認證怎麼做的呢?我們再向伺服器發送資料的過程中,黑客(攻擊者)有可能僞裝成任何一方來竊取資訊。它可以僞裝成你,來向伺服器發送資訊,也可以僞裝稱為伺服器,接受你發送的資訊。那麼怎麼解決這個問題呢?
認證如何确定你自己的唯一性呢?我們在上面的叙述過程中出現過公鑰加密,私鑰解密的這個概念。提到的私鑰隻有你一個人所有,能夠辨識唯一性,是以我們可以把順序調換一下,變成私鑰加密,公鑰解密。使用私鑰再加上摘要算法,就能夠實作數字簽名,進而實作認證。
到現在,綜合使用對稱加密、非對稱加密和摘要算法,我們已經實作了加密、資料認證、認證,那麼是不是就安全了呢?非也,這裡還存在一個數字簽名的認證問題。因為私鑰是是自己的,公鑰是誰都可以釋出,是以必須釋出經過認證的公鑰,才能解決公鑰的信任問題。
是以引入了 CA,CA 的全稱是 Certificate Authority,證書認證機構,你必須讓 CA 頒布具有認證過的公鑰,才能解決公鑰的信任問題。
全世界具有認證的 CA 就幾家,分别頒布了 DV、OV、EV 三種,差別在于可信程度。DV 是最低的,隻是域名級别的可信,EV 是最高的,經過了法律和審計的嚴格核查,可以證明網站擁有者的身份(在浏覽器位址欄會顯示出公司的名字,例如 Apple、GitHub 的網站)。不同的信任等級的機構一起形成了層級關系。
通常情況下,數字證書的申請人将生成由私鑰和公鑰以及證書簽名請求(CSR)組成的密鑰對。CSR是一個編碼的文本檔案,其中包含公鑰和其他将包含在證書中的資訊(例如域名,組織,電子郵件位址等)。密鑰對和 CSR生成通常在将要安裝證書的伺服器上完成,并且 CSR 中包含的資訊類型取決于證書的驗證級别。與公鑰不同,申請人的私鑰是安全的,永遠不要向 CA(或其他任何人)展示。
生成 CSR 後,申請人将其發送給 CA,CA 會驗證其包含的資訊是否正确,如果正确,則使用頒發的私鑰對證書進行數字簽名,然後将其發送給申請人。