大型網(wǎng)站HTTPS部署實(shí)踐點(diǎn)撥
一、HTTPS簡介
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer)是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版。HTTP協(xié)議傳輸?shù)臄?shù)據(jù)是未加密的明文,因此使用HTTP協(xié)議傳輸隱私信息非常不安全。為了保證隱私數(shù)據(jù)能加密傳輸,網(wǎng)景公司設(shè)計(jì)了SSL(Secure Sockets Layer)協(xié)議用于對HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密,從而就誕生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定義在RFC 6101中,之后IETF對SSL 3.0進(jìn)行了升級,于是出現(xiàn)了TLS(Transport Layer Security) 1.0,定義在RFC 2246。實(shí)際上我們現(xiàn)在的HTTPS都是用的TLS協(xié)議,但是由于SSL出現(xiàn)的時間比較早,并且依舊被現(xiàn)在瀏覽器所支持,因此SSL依然是HTTPS的代名詞,但無論是TLS還是SSL都是上個世紀(jì)的事情,SSL最后一個版本是3.0,今后TLS將會繼承SSL優(yōu)良血統(tǒng)繼續(xù)為我們進(jìn)行加密服務(wù)。目前TLS的版本是1.2,定義在RFC 5246中,暫時還沒有被廣泛的使用。
但是網(wǎng)站使用了HTTPS加密之后,有朋友提出使用F12還能看到用戶名密碼,例如:
這是因?yàn)镠TTPS(SSL)加密是發(fā)生在應(yīng)用層與傳輸層之間,所以在傳輸層看到的數(shù)據(jù)才是經(jīng)過加密的,而我們捕捉到的http post,是應(yīng)用層的數(shù)據(jù),此時還沒有經(jīng)過加密。加密數(shù)據(jù)只有客戶端和服務(wù)器端才能得到明文,客戶端到服務(wù)端的通信過程是安全的。及時數(shù)據(jù)在傳輸過程中被抓包,由于是加密數(shù)據(jù)也難以破解,從而保護(hù)數(shù)據(jù)在傳輸過程中的安全性。
其實(shí)除HTTPS加密之外,還有控件加密,用戶需要下載安全控件才能輸入密碼,這在銀行系統(tǒng),支付寶頁面都會經(jīng)常遇到:
通過加密控件可以解決在應(yīng)用層的http post的明文密碼。
二、HTTPS的工作原理
HTTPS是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務(wù)端和客戶端的信息傳輸都會通過SSL/TLS進(jìn)行加密,所以傳輸?shù)臄?shù)據(jù)都是加密后的數(shù)據(jù)。具體是如何進(jìn)行加密、解密、驗(yàn)證的,且看下圖:
1.客戶端發(fā)起HTTPS請求
首先客戶端發(fā)起一個HTTPS的請求給服務(wù)器端,并且將瀏覽器自己支持的一套加密規(guī)則一起發(fā)送給服務(wù)端。
2.服務(wù)端證書配置
采用HTTPS協(xié)議的服務(wù)器端要有一套數(shù)字證書,可以自己制作,也可以向組織申請。區(qū)別就是自己頒發(fā)的證書需要客戶端驗(yàn)證通過,才可以繼續(xù)訪問,而使用受信任的公司申請的證書一般不會彈出提示頁面。這套證書其實(shí)就是一對公鑰和私鑰。一般情況下可以快速申請免費(fèi)的ssl證書,而盡量避免自己生產(chǎn)證書。
服務(wù)端接收到客戶端的HTTPS請求后,會選擇出一種加密算法和HASH算法,以證書的形式返回給客戶端,證書還包含了公鑰、頒證機(jī)構(gòu)、網(wǎng)址、失效日期等信息。
3.傳送證書
服務(wù)器端將證書信息傳送會客戶端。
4.客戶端解析證書
這部分工作是由客戶端的TLS來完成的,首先會驗(yàn)證公鑰是否有效,比如頒發(fā)機(jī)構(gòu),過期時間等等,如果發(fā)現(xiàn)異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那么就生成一個隨即值。然后用證書對該隨機(jī)值進(jìn)行加密,一般證書驗(yàn)證通過后,在瀏覽器的地址欄會加上一把小鎖。
5.傳送加密信息
這部分傳送的是客戶端用證書加密后的隨機(jī)值,目的就是讓服務(wù)端得到這個隨機(jī)值,以后客戶端和服務(wù)端的通信就可以通過這個隨機(jī)值來進(jìn)行加密解密。
6.服務(wù)端解密信息
服務(wù)端用私鑰解密后,得到了客戶端傳過來的隨機(jī)值(私鑰),然后把內(nèi)容通過該值進(jìn)行對稱加密。所謂對稱加密就是,將信息和私鑰通過某種算法混合在一起,這樣除非知道私鑰,不然無法獲取內(nèi)容,而正好客戶端和服務(wù)端都知道這個私鑰,所以只要加密算法夠復(fù)雜,私鑰夠復(fù)雜,數(shù)據(jù)就夠安全。
7.傳輸加密后的信息
這部分信息是服務(wù)端用私鑰加密后的信息,可以在客戶端被還原。
8.客戶端解密信息
客戶端用之前生成的私鑰解密服務(wù)端傳過來的信息,獲取了解密后的內(nèi)容。因?yàn)檫@串密鑰只有客戶端和服務(wù)端知道,所以即使中間請求被攔截、數(shù)據(jù)被抓包也是沒法解密數(shù)據(jù)的,以此保證了通信的安全。
三、SSL證書選擇指南
- SL證書需要向國際公認(rèn)的證書證書認(rèn)證機(jī)構(gòu)(簡稱CA,Certificate Authority)申請。CA機(jī)構(gòu)頒發(fā)的證書有3種類型:
- 域名型SSL證書(DV SSL):信任等級普通,只需驗(yàn)證網(wǎng)站的真實(shí)性便可頒發(fā)證書保護(hù)網(wǎng)站。
- 企業(yè)型SSL證書(OV SSL):信任等級強(qiáng),須要驗(yàn)證企業(yè)的身份,審核嚴(yán)格,安全性更高。
增強(qiáng)型SSL證書(EV SSL):信任等級最高,一般用于銀行證券等金融機(jī)構(gòu),審核嚴(yán)格,安全性最高,同時可以激活綠色網(wǎng)址欄。
此外還可以自動生成自簽名證書,自簽名證書一般不會被瀏覽器驗(yàn)證通過,所以很少在生產(chǎn)環(huán)境中出現(xiàn),一般在內(nèi)部測試環(huán)境經(jīng)常用到。
一般情況下不同的證書,認(rèn)證等級、顯示圖標(biāo)不同,在域名的支持下、價格、保額費(fèi)用上也不同:
SSL證書廠商的選擇這里不再做過多推薦,總的原則是越大的廠商越可靠。選擇的廠商一定要提前調(diào)查好是否被信任。 如之前的沃通事件就導(dǎo)致很多公司聯(lián)系沃通更換新證書后才被瀏覽器繼續(xù)信任。
四、部署網(wǎng)站HTTPS
正式購買后如何不是證書到網(wǎng)站,實(shí)現(xiàn)HTTPS訪問呢?
首先在購買證書的時候,證書廠商都會在其幫助文檔中詳述證書部署指南,一般來說按照幫助文檔一步一步部署即可。
一般會有Apache、IIS、Nginx、Tomcat等多種部署方式,這里以Nginx為例做簡單介紹。
首先是證書的申請和下載。作者個人自己網(wǎng)站的正式是通過騰訊云提供的免費(fèi)SSL正式申請服務(wù)申請的:
下載后如下:
在Nginx的部署目錄下的conf下建立sslkey文件夾,將上述下載后的Nginx文件下的1_www.fineops.com_bundle.crt 和2_www.fineops.com.key兩個文件上傳到sslkey中。修改nginx.conf文件,按照騰訊云幫助文檔操作即可。
這里需要注意,一般證書部署后,需要設(shè)置一些http自動跳轉(zhuǎn)到https,這一般在幫助文檔中不會有。可以采用以下幾種方式:
- rewrite的方式: rewrite ^(.*)$ https://$host$1 permanent;
- nginx的497狀態(tài)碼:error_page 497 https://$host$uri?$args;
- 首頁的meta的刷新:
- <meta http-equiv=”refresh” content=”0;url=https://test.com/”> (未實(shí)踐過)
我們這里采用了proxy_redirect的方式,在nginx中配置:proxy_redirect http://www.fineops.com:443/ https://www.fineops.com/;實(shí)現(xiàn)自動跳轉(zhuǎn)至https。
五、總結(jié)
HTTP轉(zhuǎn)HTTPS是趨勢,技術(shù)也相對比較成熟。但是使用HTTPS之后,由于比HTTP多幾次握手和加解密的過程,所以對網(wǎng)站的性能會有一定的下降。另外部署證書的服務(wù)器一定要升級openssl,提高TSL版本,避免中間人攻擊利用等。
在HTTP轉(zhuǎn)HTTPS的過程中,主要注意頁面跳轉(zhuǎn)、第三方接口、靜態(tài)資源CDN等方面在轉(zhuǎn)HTTPS之后的測試,確保跳轉(zhuǎn)和加載沒有問題。