為什麼要把網站升級到HTTPS

人人網FED發表於2017-09-03

筆者最近把部落格網站升級到了https:fed.renren.com,為什麼要升級呢?

舉一個最簡單的例子,當我開啟這個網頁的時候:在網頁的右下角會顯示一個廣告:

但是這個網站是美國的:

為什麼中國的廣告會打到美國去了?並且不止一個網站有這個問題,自己的部落格網站在我家開啟經常也會有這個問題,經常會彈一些廣告,這是為什麼呢?

因為網站被運營商劫持了,它往你的html裡面注入了一段廣告的html,如下圖所示:

這個時候運營商就相當於一箇中間人,如下圖所示:

為什麼要把網站升級到HTTPS

這個我在《https連線的前幾毫秒發生了什麼》已經介紹過,不過不太一樣的是,由於中間人的身份比較特殊,是運營商,所以它是在正常的連線上面的。也可以說由於運營商暗地裡做了劫持,你也可以認為它不是一個正常的連線了。

不管怎麼樣,這種劫持也叫http劫持只發生在http連線上,而https的連線是沒這個問題的,基本只要開啟的是https的網頁都不會被注入廣告。因為傳輸的資料都是加密的,中間人收到的是一串無法解密的文字,它也不知道怎麼篡改。

防火防盜防運營商,但是注入廣告還算是小事,因為如果是http連線你的資料在網路上都是明文傳輸的,包括你的密碼等敏感資訊,你和伺服器之間經過的路由都可以嗅探到你的資料,可以做些修改如嵌入一個廣告,做一些破壞,或者只單純的抓取資訊如郵件內容、賬號密碼等。所以使用https是很有必要的,火狐會在非https的網頁的密碼輸入框提示不安全:

Chrome/firefox等瀏覽器會在較明顯的位置提示當前http網站不安全,只要點一下位址列左邊的i按鈕就會彈出來:

並且https的網站能夠提升SEO。

在外面連的公共wifi,使用https能夠減少賬號資訊被盜的風險,但也不是100%安全,因為它可以用其它的方式如在你的裝置上種植木馬等獲取和控制你的賬號。

不管怎麼樣,搞一個https還是很有必要的,至少不要讓別人以為那個廣告是你自己的網站打的。那怎麼建立一個https的網站呢?我在《https連線的前幾毫秒發生了什麼》已經簡單介紹過,需要購買SSL的證照,網上也有一些免費的證照。在某家證照購買機構可以看到證照的分類和價格:

證照分為三種dv(域名型)、ov(企業型)和ev(增強型),dv是最簡單的只要有一個可以訪問的域名就可以申請,而ov是給企業用的,申請比較嚴格需要提供企業的相關材料,ev可以在位址列上顯示公司的名字,如sitepoint.com。對於我們這種小部落格網站搞一個dv型的就可以了。

有一個免費的dv型證照頒發機構叫letsencrypt,它可以提供三個月的免費使用,到期了再續一下就行,所以說它是免費的。而且安裝和申請非常簡單,使用certbot安裝。下面簡單介紹下安裝過程:

先開啟certbot的網站,選擇你的作業系統,如筆者用的是centos + nginx:

然後它就會提示你怎麼裝了,先下載一個編譯好的可執行檔案:

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto複製程式碼

然後再執行安裝的命令:

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左右,這個是需要付出點代價的,但是由於瀏覽器左下角會提示使用者“正在建立安全連線”,有一個緩衝的過程,所以其實還好。


相關文章