簡介
HTTPS(全稱:HyperText Transfer Protocol over Secure Socket Layer),可以理解為HTTP+SSL/TLS,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL,用于安全的HTTP數(shù)據(jù)傳輸。
作用
- 建立一個(gè)信息安全通道,來保證數(shù)據(jù)傳輸?shù)陌踩?,防止被中間人劫持
- 確認(rèn)網(wǎng)站的真實(shí)性
和HTTP的區(qū)別:
- HTTPS是加密傳輸協(xié)議,HTTP是名文傳輸協(xié)議;
- HTTPS需要用到SSL證書,而HTTP不用;
- HTTPS比HTTP更加安全,對搜索引擎更友好,利于SEO(1)谷歌優(yōu)先索引HTTPS網(wǎng)頁(2)百度開放收錄https站點(diǎn)
- HTTPS標(biāo)準(zhǔn)端口443,HTTP標(biāo)準(zhǔn)端口80;
- HTTPS基于傳輸層,HTTP基于應(yīng)用層;
- HTTPS在瀏覽器顯示綠色安全鎖,HTTP沒有顯示;
SSL/TLS
SSL/TLS層負(fù)責(zé)客戶端和服務(wù)器之間的加解密算法協(xié)商、密鑰交換、通信連接的建立
SSL/TLS中使用了非對稱加密,對稱加密以及散列函數(shù)Hash
客戶端使用非對稱加密與服務(wù)器進(jìn)行通信,實(shí)現(xiàn)身份驗(yàn)證并協(xié)商對稱加密使用的密鑰,然后對稱加密算法采用協(xié)商密鑰對信息以及信息摘要(基于散列函數(shù)驗(yàn)證信息的完整性)進(jìn)行加密通信,不同的節(jié)點(diǎn)之間采用的對稱密鑰不同,從而可以保證信息只能通信雙方獲取
非對稱加密
RSA、DSA、DH、ECDSA、ECDHE,算法特點(diǎn)是,密鑰成對出現(xiàn),一般稱為公鑰(公開)和私鑰(保密),公鑰加密的信息只能私鑰解開,私鑰加密的信息只能公鑰解開。因此掌握公鑰的不同客戶端之間不能互相解密信息,只能和掌握私鑰的服務(wù)器進(jìn)行加密通信,服務(wù)器可以實(shí)現(xiàn)1對多的通信,客戶端也可以用來驗(yàn)證掌握私鑰的服務(wù)器身份。
非對稱加密的特點(diǎn)是信息傳輸1對多,服務(wù)器只需要維持一個(gè)私鑰就能夠和多個(gè)客戶端進(jìn)行加密通信,但服務(wù)器發(fā)出的信息能夠被所有的客戶端解密,且該算法的計(jì)算復(fù)雜,加密速度慢。對稱加密
常見的有 AES-CBC、DES、3DES、AES-GCM等,相同的密鑰可以用于信息的加密和解密,掌握密鑰才能獲取信息,能夠防止信息竊聽,通信方式是1對1;
對稱加密的優(yōu)勢是信息傳輸1對1,需要共享相同的密碼,密碼的安全是保證信息安全的基礎(chǔ),服務(wù)器和 N 個(gè)客戶端通信,需要維持 N 個(gè)密碼記錄,且缺少修改密碼的機(jī)制;散列函數(shù)Hash
常見的有 MD5、SHA-1、SHA-2、SHA-256,該類函數(shù)特點(diǎn)是函數(shù)單向不可逆、對輸入非常敏感、輸出長度固定,針對數(shù)據(jù)的任何修改都會(huì)改變散列函數(shù)的結(jié)果,用于防止信息篡改并驗(yàn)證數(shù)據(jù)的完整性;
在信息傳輸過程中,散列函數(shù)不能單獨(dú)實(shí)現(xiàn)信息防篡改,因?yàn)槊魑膫鬏?,中間人可以修改信息之后重新計(jì)算信息摘要,因此需要對傳輸?shù)男畔⒁约靶畔⒄M(jìn)行加密;
握手過程
HTTPS在傳輸數(shù)據(jù)之前需要客戶端(瀏覽器)與服務(wù)端(網(wǎng)站)之間進(jìn)行一次握手,在握手過程中將確立雙方加密傳輸數(shù)據(jù)的密碼信息。
1.client_hello
客戶端發(fā)起請求,以明文傳輸請求信息,包含版本信息,加密套件候選列表,壓縮算法候選列表,隨機(jī)數(shù),擴(kuò)展字段等
相關(guān)信息如下:
- 支持的最高TSL協(xié)議版本version,從低到高依次SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,當(dāng)前基本不再使用低于 TLSv1 的版本;
- 客戶端支持的加密套件列表cipher suites,每個(gè)加密套件對應(yīng)前面TLS原理中的四個(gè)功能的組合:認(rèn)證算法 Au (身份驗(yàn)證)、密鑰交換算法 KeyExchange(密鑰協(xié)商)、對稱加密算法 Enc (信息加密)和信息摘要 Mac(完整性校驗(yàn));
- 支持的壓縮算法列表compression methods,用于后續(xù)的信息壓縮傳輸;
- 隨機(jī)數(shù) random_C,用于后續(xù)的密鑰的生成;
- 擴(kuò)展字段extensions,支持協(xié)議與算法的相關(guān)參數(shù)以及其它輔助信息等,常見的 SNI 就屬于擴(kuò)展字段,后續(xù)單獨(dú)討論該字段作用。
2.server_hello + server_certificate + sever_hello_done
- server_hello, 服務(wù)端返回協(xié)商的信息結(jié)果,包括選擇使用的協(xié)議版本version,選擇的加密套件cipher suite,選擇的壓縮算法compression method、隨機(jī)數(shù)random_S等,其中隨機(jī)數(shù)用于后續(xù)的密鑰協(xié)商;
- erver_certificates, 服務(wù)器端配置對應(yīng)的證書鏈,用于身份驗(yàn)證與密鑰交換;
- server_hello_done,通知客戶端server_hello信息發(fā)送結(jié)束;
3.證書校驗(yàn)
客戶端驗(yàn)證證書的合法性,如果驗(yàn)證通過才會(huì)進(jìn)行后續(xù)通信,否則根據(jù)錯(cuò)誤情況不同做出提示和操作,合法性驗(yàn)證包括如下:
- 證書鏈的可信性 trusted certificate path
- 證書是否吊銷revocation,有兩類方式離線 CRL 與在線 OCSP,不同的客戶端行為會(huì)不同
- 有效期expiry date,證書是否在有效時(shí)間范圍
- 域名domain,核查證書域名是否與當(dāng)前的訪問域名匹配
證書內(nèi)容:
申請者公鑰、申請者的組織信息和個(gè)人信息、簽發(fā)機(jī)構(gòu) CA的信息、有效時(shí)間、證書序列號(hào)等信息的明文,同時(shí)包含一個(gè)簽名;
簽名的產(chǎn)生:使用散列函數(shù)計(jì)算公開的明文信息的信息摘要,然后,采用CA的私鑰對信息摘要進(jìn)行加密,密文即簽名。
驗(yàn)證證書時(shí),客戶端讀取證書中的相關(guān)的明文信息,采用相同的散列函數(shù)計(jì)算得到信息摘要,然后,利用對應(yīng)CA的公鑰(從本地取出)解密簽名數(shù)據(jù),對比證書的信息摘要,如果一致,則可以確認(rèn)證書的合法性,即公鑰合法;
4.client_key_exchange + change_cipher_spec + encrypted_handshake_message
- key_exchange
合法性驗(yàn)證通過之后,客戶端計(jì)算產(chǎn)生隨機(jī)數(shù)字Pre-master,并用證書公鑰加密,發(fā)送給服務(wù)器
基于之前交換的兩個(gè)明文隨機(jī)數(shù)random_C和random_S,
協(xié)商密鑰 enc_key = Fuc(random_C, random_S, Pre-Master)
change_cipher_spec
客戶端通知服務(wù)器后續(xù)的通信都采用協(xié)商的通信密鑰和加密算法進(jìn)行加密通信encrypted_handshake_message
結(jié)合之前所有通信參數(shù)的hash值與其它相關(guān)信息生成一段數(shù)據(jù),采用協(xié)商密鑰enc_key與算法進(jìn)行加密,然后發(fā)送給服務(wù)器用于數(shù)據(jù)與握手驗(yàn)證;
5.change_cipher_spec + encrypted_handshake_message
- key_exchange
- 服務(wù)器用私鑰解密加密的Pre-master數(shù)據(jù),基于之前交換的兩個(gè)明文隨機(jī)數(shù) random_C 和 random_S
- 基于之前交換的兩個(gè)明文隨機(jī)數(shù)random_C和random_S,
協(xié)商密鑰 enc_key = Fuc(random_C, random_S, Pre-Master)
change_cipher_spec
計(jì)算之前所有接收信息的hash值,然后解密客戶端發(fā)送的encrypted_handshake_message,驗(yàn)證數(shù)據(jù)和密鑰正確性
驗(yàn)證通過之后,服務(wù)器同樣發(fā)送change_cipher_spec以告知客戶端后續(xù)的通信都采用協(xié)商的密鑰與算法進(jìn)行加密通信encrypted_handshake_message
服務(wù)器也結(jié)合所有當(dāng)前的通信參數(shù)信息生成一段數(shù)據(jù)并采用協(xié)商密鑰enc_key與算法加密并發(fā)送到客戶端;
6.握手結(jié)束
客戶端計(jì)算所有接收信息的hash值,并采用協(xié)商密鑰解密encrypted_handshake_message,驗(yàn)證服務(wù)器發(fā)送的數(shù)據(jù)和密鑰,驗(yàn)證通過則握手完成;
開始使用協(xié)商密鑰與算法進(jìn)行加密通信
雙向驗(yàn)證:
服務(wù)器也可以要求驗(yàn)證客戶端,即雙向認(rèn)證,可以在過程2要發(fā)送 client_certificate_request 信息,客戶端在過程4中先發(fā)送 client_certificate與certificate_verify_message 信息,證書的驗(yàn)證方式基本相同,certificate_verify_message 是采用client的私鑰加密的一段基于已經(jīng)協(xié)商的通信信息得到數(shù)據(jù),服務(wù)器可以采用對應(yīng)的公鑰解密并驗(yàn)證。