全站HTTPS沒你想象的那么簡單
對自己無知這件事本身的無知真的挺可怕
認知偏差現(xiàn)象一直存在于我們每個人身上,誰也避免不掉,不過是有的人了解這件事兒,有的人不怎么知道而已,這就產(chǎn)生了「無知而不自知」的認知偏差。當(dāng)然,這時候你自己忽悠自己倒沒什么,頂多讓自己每天感覺自己挺厲害的,沉浸于虛幻的優(yōu)越感中,以為自己比大多數(shù)人都優(yōu)秀,這倒不是一件什么壞事情,但是,如果你和別人溝通交流中展現(xiàn)出來,那挺可怕的,況且有時候你自己并不知道,達克效應(yīng)(Dunning-Kruger Effect)描述的就是這種現(xiàn)象。
避免這種現(xiàn)象在自己身上的存在,沒什么特殊方法,多學(xué)習(xí)那些本身就極其優(yōu)秀的人是怎么思考和生存的,表現(xiàn)出謙遜算其中一種,還有就是多讀書。就這樣...
全站 HTTPS 必要準(zhǔn)備工作
做任何一件事情最好的情況就是你剛好做過,這倒沒什么可說的,因為第二次總是要比第一次好。如果你沒做過這件事怎么辦?沒事,去看看別人怎么做的。
升級全站 HTTPS 工作在兩年前左右應(yīng)該是討論最火的了,在2014年底,Google Chromium 安全團隊提議將所有的 HTTP 協(xié)議網(wǎng)站標(biāo)注為不安全,市場占有率較高的 Chrome 瀏覽器也是這么做的,所以在接下來一段時間內(nèi),各個大廠、大公司都逐步升級了 HTTPS 協(xié)議,當(dāng)然,去年 Apple 也宣布所有應(yīng)用開發(fā)者必須在 2017 年 1 月 1 日之前實現(xiàn)所有的 App 接入安全地服務(wù)器,即網(wǎng)絡(luò)傳輸協(xié)議使用 HTTPS。所以呢,我們就簡單的看一下國內(nèi)這些頂尖互聯(lián)網(wǎng)企業(yè)如何實現(xiàn)全站 HTTPS 的:
- 淘寶
啟用全站HTTPS后不僅更安全而且更快 看淘寶是如何做到的
- 百度
大型網(wǎng)站的HTTPS實踐一:HTTPS協(xié)議和原理
HTTPS對網(wǎng)站性能SEO有哪些影響?
大型網(wǎng)站HTTPS實踐三:基于協(xié)議和配置的優(yōu)化
大型網(wǎng)站的HTTPS實踐四:協(xié)議層以外的實踐
看完這些文章后,估計你就可以知道要買 SSL 證書了,也可以去買 SSL 證書了,具體是使用各個云服務(wù)商家的免費單域名證書,還是業(yè)務(wù)需要更強大的泛域名證書、OV 證書等等,你就需要看看我寫的這兩篇文章了(好不要臉吖..):
- 讓你的網(wǎng)站免費支持 HTTPS 及 Nginx 平滑升級
- 一篇文章讓你搞懂 SSL 證書
分析整個系統(tǒng)制定計劃
有計劃才能沒變化。其實也沒什么要做的,只有一件事,你接下來要做的唯一一件事就是了解整個系統(tǒng)。統(tǒng)計出所有已用到的域名,需要購買什么類型域名證書,是二級域名、三級域名還是各種亂七八糟的域名,自己分析;再然后,了解每個域名背后的服務(wù)是如何運作的,這里邊會涉及到前端頁面、一些資源文件的固定協(xié)議引用,后端代碼中關(guān)于協(xié)議獲取是寫死的還是動態(tài)的,數(shù)據(jù)庫中存儲的網(wǎng)址鏈接等等,這些統(tǒng)統(tǒng)要考慮到。
分析完系統(tǒng)后,其中肯定會存在混合協(xié)議訪問請求,HTTPS 下瀏覽器會攔截掉所有 HTTP 請求的,不同頁面間跳轉(zhuǎn)、不同服務(wù)域名間跳轉(zhuǎn)如果是以固定的 HTTP 協(xié)議寫死的,要支持全站 HTTPS 協(xié)議,首要解決的是以當(dāng)前協(xié)議來靈活的區(qū)分不同域名服務(wù)間的跳轉(zhuǎn)。其次,HTTPS 協(xié)議首次請求存在多次握手,因此網(wǎng)絡(luò)耗時變長問題,可能會影響系統(tǒng)訪問速度。所以,我是建議計劃分為兩個階段來進行全站 HTTPS 升級:
一階段:將目前所有域名配置為支持 HTTP 和 HTTPS 兩種協(xié)議,不做 HTTP 請求強制 HTTPS 跳轉(zhuǎn)。在驗證及測試完成 HTTPS 下,系統(tǒng)所有服務(wù)以及訪問速度均無問題后,進行實施二階段計劃。
二階段:在上階段不強制 HTTPS 訪問驗證通過后,域名做強制 HTTPS 協(xié)議。即當(dāng)用戶以 HTTP 協(xié)議訪問系統(tǒng)時, 如用 Nginx 做強制 301 跳轉(zhuǎn)到 HTTPS 協(xié)議,做到全站 HTTPS 安全訪問協(xié)議。
不出意外,按照這兩步計劃,應(yīng)該可以穩(wěn)妥是進行全站 HTTPS 升級工作,當(dāng)然,期間不可避免的會踩一些坑,因為每個公司業(yè)務(wù)不同、系統(tǒng)環(huán)境不同等原因,都會遇到不可預(yù)估的問題,一個個解決就行了。我下面會寫一下升級期間共性的、也就是每個人都必須要踩的坑和如何解決這些問題。
十條注意事項
1、瀏覽器攔截混合訪問請求
由于瀏覽器安全規(guī)則,在 HTTPS 請求下通過 JavaScript 請求 HTTP 請求或引入 HTTP 協(xié)議資源文件,會報“Mixed Content”錯誤,導(dǎo)致請求無法繼續(xù)。
Mixed Content: The page at 'https://domain.com/' was loaded over HTTPS, but requested an insecure script 'http://domain.com/'. This request has been blocked; the content must be served over HTTPS.
2、前端 HTML、JS 資源引用存在 HTTP
前端頁面及 js 文件中,寫死的 http:// 協(xié)議資源及跳轉(zhuǎn)改為根據(jù)當(dāng)前協(xié)議切換(//)。
使用相對協(xié)議,如:
- <script src="//domain.com/jquery.js</script>
- <img src="//domain.com/img/logo.png">
或者代碼自行判斷都可以。如果一個頁面內(nèi)包含多個域名請求,需所有域名均支持https,否則部分瀏覽器會有警告提醒或打不開。
3、移動端適配 HTTPS
如果你們存在移動客戶端(APP)也需要適配 HTTPS,所以必須做調(diào)用接口的相應(yīng)修改,當(dāng)然,要注意運營商 DNS 劫持(尤其是移動)也會對 HTTPS 請求成功率造成很大影響,其實可以做好 HTTP/HTTPS 兩種協(xié)議都支持,做好出問題隨時動態(tài)降級切換準(zhǔn)備。
4、項目中存在的配置問題
項目中用到的配置文件中存在 HTTP 鏈接,要充分了解其用途。如果不是可以統(tǒng)一動態(tài)更新的配置文件,都要考慮更改后做服務(wù)的發(fā)布,這時候要來考慮對生成環(huán)境業(yè)務(wù)的影響以及測試、開發(fā)環(huán)境的影響等問題。如頁面間跳轉(zhuǎn)、權(quán)限、登錄驗證、第三方服務(wù)(支付、推送)回調(diào)這些配置等。
5、關(guān)于 request.getScheme() 這個坑
如果你的架構(gòu)上使用了 Nginx + Tomcat 集群, 且 Nginx 下配置了 SSL ,Tomcat 沒有配置 SSL ,這時候其實客戶端已經(jīng)是使用 HTTPS 協(xié)議了,但你的 Tomcat 中用 request.getScheme()、request.getRequestURL() 會獲取到的是 HTTP,并不是 HTTPS 。當(dāng)然可以代碼中避免,或者通過配置 Nginx 和 Tomcat 解決,看這篇文章:http://www.cnblogs.com/interdrp/p/4881785.html
6、SSL 證書類型
在之前說選購 SSL 證書的時候,你就要充分考慮業(yè)務(wù)上域名需要的證書類型,避免需要泛域名證書而你買了單域名證書,當(dāng)然泛域名證書還是分為支持級別的,如購買 *.example.com 證書,那么該證書支持 a.example.com, a1.example.com, a2.example.com 以此類推域名,但是不支持 b.a.example.com(另一級), b1.a.example.com 類域名,如需支持,需另外再購買一張 *.a.example.com 證書。
7、Nginx 配置同一個 server 段不支持配置多個證書
8、Nginx 配置 HTTP 強制跳轉(zhuǎn) HTTPS
通過配置 Nginx 域名 HTTP 請求 302 跳轉(zhuǎn)實現(xiàn)全站 HTTPS。千萬不能有 POST 請求,這時候瀏覽器會先做 302 跳轉(zhuǎn),在以 Get 方法請求會導(dǎo)致 Post Body 丟失。
具體配置如下:
- server {
- listen 80;
- listen 443 ssl;
- server_name www.domain.com;
- ssl on;
- ssl_certificate 1_www.domain.com_bundle.crt;
- ssl_certificate_key 2_www.domain.com.key;
- ssl_session_timeout 5m;
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
- ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- ssl_prefer_server_ciphers on;
- if ($scheme != 'https') {
- rewrite ^(.*)$ https://$server_name$1 permanent;
- }
- location / {
- root html;
- index index.html index.htm;
- }
- }
9、所有環(huán)境均要進行升級
不僅僅要考慮生成環(huán)境進行全站 HTTPS 升級問題,包括開發(fā)、測試、預(yù)發(fā)布等多種不同環(huán)境均要進行升級,來保持與生產(chǎn)環(huán)境的一致性,減小不可預(yù)估因素的發(fā)生。如果你沒有完善的運維系統(tǒng),一個個配置文件改的可是真的很痛苦,你試試想想看上百個配置,淚...
10、打死你都想不到的地方
太多了,自由發(fā)揮吧。做到兵來將擋水來土掩,佛來斬佛,魔來斬魔就行了。
注意事項寫完了,現(xiàn)在插播一條硬廣,我們團隊目前正需要對技術(shù)有追求的小伙伴一起來共同學(xué)習(xí)進步,看到這篇文章有想換個工作環(huán)境的,當(dāng)然你要基本了解使用過分布式架構(gòu),快快聯(lián)系我。
總結(jié)一下
不知道這一篇算不算所謂的「干貨」了,現(xiàn)在好多人都喊著要所謂的干貨,其實哪有那么多干貨阿。這一篇主要寫了一下在全站升級 HTTPS 的過程與注意點,幾乎都是在實際工作中步驟的重現(xiàn)了,當(dāng)然,升級完成我們還是需要對整個系統(tǒng)進行性能、速度的測試,以及如何更好的利用 HTTPS ,比如上 HTTP 2.0 ,據(jù)說提升很大的。
希望對你有所幫助。