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