為什么要把網站升級到HTTPS
筆者最近把博客網站升級到了https:https://fed.renren.com,為什么要升級呢?
舉一個最簡單的例子,當我打開這個網頁的時候:在網頁的右下角會顯示一個廣告:
但是這個網站是美國的:
為什么中國的廣告會打到美國去了?并且不止一個網站有這個問題,自己的博客網站在我家打開經常也會有這個問題,經常會彈一些廣告,這是為什么呢?
因為網站被運營商劫持了,它往你的html里面注入了一段廣告的html,如下圖所示:
這個時候運營商就相當于一個中間人,如下圖所示:
這個我在《https連接的前幾毫秒發(fā)生了什么》已經介紹過,不過不太一樣的是,由于中間人的身份比較特殊,是運營商,所以它是在正常的連接上面的。也可以說由于運營商暗地里做了劫持,你也可以認為它不是一個正常的連接了。
不管怎么樣,這種劫持也叫http劫持只發(fā)生在http連接上,而https的連接是沒這個問題的,基本只要打開的是https的網頁都不會被注入廣告。因為傳輸的數據都是加密的,中間人收到的是一串無法解密的文本,它也不知道怎么篡改。
防火防盜防運營商,但是注入廣告還算是小事,因為如果是http連接你的數據在網絡上都是明文傳輸的,包括你的密碼等敏感信息,你和服務器之間經過的路由都可以嗅探到你的數據,可以做些修改如嵌入一個廣告,做一些破壞,或者只單純的抓取信息如郵件內容、賬號密碼等。所以使用https是很有必要的,火狐會在非https的網頁的密碼輸入框提示不安全:
Chrome/firefox等瀏覽器會在較明顯的位置提示當前http網站不安全,只要點一下地址欄左邊的i按鈕就會彈出來:
并且https的網站能夠提升SEO。
在外面連的公共wifi,使用https能夠減少賬號信息被盜的風險,但也不是100%安全,因為它可以用其它的方式如在你的設備上種植木馬等獲取和控制你的賬號。
不管怎么樣,搞一個https還是很有必要的,至少不要讓別人以為那個廣告是你自己的網站打的。那怎么建立一個https的網站呢?我在《https連接的前幾毫秒發(fā)生了什么》已經簡單介紹過,需要購買SSL的證書,網上也有一些免費的證書。在某家證書購買機構可以看到證書的分類和價格:
證書分為三種dv(域名型)、ov(企業(yè)型)和ev(增強型),dv是最簡單的只要有一個可以訪問的域名就可以申請,而ov是給企業(yè)用的,申請比較嚴格需要提供企業(yè)的相關材料,ev可以在地址欄上顯示公司的名字,如sitepoint.com。對于我們這種小博客網站搞一個dv型的就可以了。
有一個免費的dv型證書頒發(fā)機構叫l(wèi)etsencrypt,它可以提供三個月的免費使用,到期了再續(xù)一下就行,所以說它是免費的。而且安裝和申請非常簡單,使用certbot安裝。下面簡單介紹下安裝過程:
先打開certbot的網站,選擇你的操作系統,如筆者用的是centos + nginx:
然后它就會提示你怎么裝了,先下載一個編譯好的可執(zhí)行文件:
- wget https://dl.eff.org/certbot-auto
- chmod a+x certbot-auto
然后再執(zhí)行安裝的命令:
- sudo ./path/to/certbot-auto --nginx
它會先安裝一些python的包,之后會讓你輸入你的郵箱,然后自動去找你的nginx配置文件,找出里面的server的域名列出來,讓你選哪個要安裝https證書:
- Which names would you like to activate HTTPS for?
- ——————————————————————————-
- 1: fed.renren.com
- ——————————————————————————-
- Select the appropriate numbers separated by commas and/or spaces, or leave input
- blank to select all options shown (Enter ‘c’ to cancel):
選好了之后它就會去申請證書,然后檢驗域名的合法性,如果報了連接超時的錯誤:
- – The following errors were reported by the server:
- Domain: trumporate.com
- Type: connection
- Detail: Timeout
那么很可能是防火墻iptables的443端口沒有開放,只要把它和80端口一樣開放一下就好了。
成功驗證后它就會把SSL的證書下載下來,同時給nginx的添加ssl的配置:
- listen 443 ssl; # managed by Certbot
- ssl_certificate /etc/letsencrypt/live/fed.renren.com/fullchain.pem; # managed by Certbot
- ssl_certificate_key /etc/letsencrypt/live/fed.renren.com/privkey.pem; # managed by Certbot
- include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
還會提示是否要把http的重定向到https,如果選是的話,它就會添加以下nginx配置:
- if ($scheme != "https") {
- return 301 https://$host$request_uri;
- } # managed by Certbot
301表示資源***轉移,瀏覽器收到301響應之后就會自動做重定向。
由于網站的很多圖片的地址是http的已經固化到數據庫里面,導致需要在https的網頁里加載http的圖片,這樣即使是配了證書,瀏覽器也會提示不安全,瀏覽器地址樣欄的小鎖也沒有了:
如果手動去改數據庫會比較麻煩,有個比較簡單的方法就是使用讓http升級的meta標簽:
- <meta http-equiv="Content-Security-Policy"
- content="upgrade-insecure-requests">
這樣頁面上所有的http請求都會強制變成https的請求。如果某些請求的服務器不支持https那這些請求就會掛掉,但我這個網站沒有這個問題。
這樣就愉快地把網站免費升級成https了:
在瀏覽器查看證書:
https升級后的問題是:加密和解密需要占用更多的CPU,并且加密后的數據會變大,但是據筆者觀察加上gzip壓縮之后,https傳輸的內容大小幾乎和http一樣。除了正常的tcp連接之外,還要建立ssl連接,這個時間一般在0.3s ~ 0.5s左右,這個是需要付出點代價的,但是由于瀏覽器左下角會提示用戶“正在建立安全連接”,有一個緩沖的過程,所以其實還好。
【本文是51CTO專欄作者“人人網FED”的原創(chuàng)稿件,轉載請通過51CTO聯系原作者獲取授權】