筆者最近把博客網站升級到了https:www.rrfed.com,爲何要升級呢?html
舉一個最簡單的例子,當我打開這個網頁的時候:在網頁的右下角會顯示一個廣告:python
可是這個網站是美國的:react
爲何中國的廣告會打到美國去了?而且不止一個網站有這個問題,本身的博客網站在我家打開常常也會有這個問題,常常會彈一些廣告,這是爲何呢?jquery
由於網站被運營商劫持了,它往你的html裏面注入了一段廣告的html,以下圖所示:nginx
這個時候運營商就至關於一箇中間人,以下圖所示:數據庫
這個我在《https鏈接的前幾毫秒發生了什麼》已經介紹過,不過不太同樣的是,因爲中間人的身份比較特殊,是運營商,因此它是在正常的鏈接上面的。也能夠說因爲運營商暗地裏作了劫持,你也能夠認爲它不是一個正常的鏈接了。centos
無論怎麼樣,這種劫持也叫http劫持只發生在http鏈接上,而https的鏈接是沒這個問題的,基本只要打開的是https的網頁都不會被注入廣告。由於傳輸的數據都是加密的,中間人收到的是一串沒法解密的文本,它也不知道怎麼篡改。瀏覽器
防火防盜防運營商,可是注入廣告還算是小事,由於若是是http鏈接你的數據在網絡上都是明文傳輸的,包括你的密碼等敏感信息,你和服務器之間通過的路由均可以嗅探到你的數據,能夠作些修改如嵌入一個廣告,作一些破壞,或者只單純的抓取信息如郵件內容、帳號密碼等。因此使用https是頗有必要的,火狐會在非https的網頁的密碼輸入框提示不安全:安全
Chrome/firefox等瀏覽器會在較明顯的位置提示當前http網站不安全,只要點一下地址欄左邊的i按鈕就會彈出來:bash
而且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: www.rrfed.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/www.rrfed.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左右,這個是須要付出點代價的,可是因爲瀏覽器左下角會提示用戶「正在創建安全鏈接」,有一個緩衝的過程,因此其實還好。