為什麼要把網站升級到HTTPS

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

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

但是這個網站是美國的:

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

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

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

這個我在《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-autonchmod a+x certbot-auton

然後再執行安裝的命令:

sudo ./path/to/certbot-auto --nginxn

它會先安裝一些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 Certbotnssl_certificate /etc/letsencrypt/live/fed.renren.com/fullchain.pem; # managed by Certbotnssl_certificate_key /etc/letsencrypt/live/fed.renren.com/privkey.pem; # managed by Certbotninclude /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbotn

還會提示是否要把http的重定向到https,如果選是的話,它就會添加以下nginx配置:

if ($scheme != "https") {n return 301 https://$host$request_uri;n} # managed by Certbotn

301表示資源永久轉移,瀏覽器收到301響應之後就會自動做重定向。

由於網站的很多圖片的地址是http的已經固化到資料庫裡面,導致需要在https的網頁里載入http的圖片,這樣即使是配了證書,瀏覽器也會提示不安全,瀏覽器地址樣欄的小鎖也沒有了:

如果手動去改資料庫會比較麻煩,有個比較簡單的方法就是使用讓http升級的meta標籤:

<meta http-equiv="Content-Security-Policy" n content="upgrade-insecure-requests">n

這樣頁面上所有的http請求都會強制變成https的請求。如果某些請求的伺服器不支持https那這些請求就會掛掉,但我這個網站沒有這個問題。

這樣就愉快地把網站免費升級成https了:

在瀏覽器查看證書:

https升級後的問題是:加密和解密需要佔用更多的CPU,並且加密後的數據會變大,但是據筆者觀察加上gzip壓縮之後,https傳輸的內容大小几乎和http一樣。除了正常的tcp連接之外,還要建立ssl連接,這個時間一般在0.3s ~ 0.5s左右,這個是需要付出點代價的,但是由於瀏覽器左下角會提示用戶「正在建立安全連接」,有一個緩衝的過程,所以其實還好。


推薦閱讀:

浙大博士在阿里:曾想低頭離開,沒想到一干就停不下來……
酷站推薦 - ssl.do - SSL.DO | SSL證書
流量劫持背後:Google 在用「看不見」的方式保護你的隱私安全
從零部署一個https網站
看到網址前的小嘆號,隱私就處在危險的境地

TAG:HTTPS | Nginx | 前端开发 |