為什麼要使用 HTTPS ? 首先來說一下 HTTP 與 HTTPS 協議的區別吧,他們的根本區別就是 HTTPS 在 HTTP 協議的基礎上加入了 SSL 層,在傳輸層對網路連接進行加密。簡單點說在 HTTP 協議下你的網站是光著身子在奔跑,但到了 HTTPS 下你穿了一件衣服,別人看不到你的肌肉 ...
為什麼要使用 HTTPS ?
首先來說一下 HTTP 與 HTTPS 協議的區別吧,他們的根本區別就是 HTTPS 在 HTTP 協議的基礎上加入了 SSL 層,在傳輸層對網路連接進行加密。簡單點說在 HTTP 協議下你的網站是光著身子在奔跑,但到了 HTTPS 下你穿了一件衣服,別人看不到你的肌肉了(當然,這好像不是好事,不重要),更安全了一點點,就大概這個意思。
SSL 依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通信加密。採用 HTTPS 的伺服器必須從證書頒發機構 CA(Certificate Authority)申請一個用於證明伺服器用途類型的證書,當然一般都有收費,而且不便宜,其實你也可以通過 OpenSSL 自己造一個證書,這樣有一個弊端是大家都不信任你造的證書。那怎麼辦?
你必須知道的步驟
通過上面的簡單介紹你應該知道了,要想你的網站支持 HTTPS ,就必須有一個被信任的證書,那這個證書就必須由證書頒發機構(如VeriSign、Microsoft等)頒發的,否則你就會遇到如打開 12306.cn 這樣的您的連接不是私密連接
的尷尬。
你肯定不想用戶打開後,你的網站是上面這樣的,身邊有好多朋友買票時問過我這是什麼意思?我都沒辦法解釋給他們,哎。所以你需要要有下麵幾個東西:
- 一個功能變數名稱(你肯定有)
- Web 伺服器(Nginx,Apache,IIS都行)
- SSL 證書(最好 CA 機構頒發的)
就完了,上面三個東西可能最麻煩就是搞到一個被全世界都信任的證書了,沒關係,現在我試著讓你免費獲取一個,註意是免費!!!
提供免費的證書商也就那麼幾個,最知名的可能是 StartSSL ,其他我還知道 Let's Encrypt ,不過這裡我用的是國內騰訊雲的。
感謝騰訊雲
對於得到一個受信任的證書
很簡單,找第三方證書頒發機構購買就行了,但是一個每年大幾千的證書費用對於小企業或個人來說,有點接受不了,或者是沒錢。現在好了,騰訊雲認證用戶可以申請到賽門鐵克(Symantec)免費的 TrustAsia DV SSL 證書了。
登錄騰訊雲管理平臺
SSL 證書申請地址在這裡: https://console.qcloud.com/ssl ,點擊申請證書
,會彈出下麵的框:
上面顯示什麼價值1900元/年
,不要管,點擊確認
按鈕。彈出表單你填寫你要綁定的功能變數名稱就行了:
接下來會驗證你的功能變數名稱,簡單說就是驗證一下這個功能變數名稱是不是你的,所以你要在功能變數名稱解析添加一條 CName 記錄,實在不懂的話,官方也有怎麼添加的文檔。
一般驗證過程會很快,幾個小時吧,申請通過後,這時候你看到狀態是已頒發
後,就能下載證書了。
下載下來你打開文件會看到Nginx,Apache,IIS
三個文件夾,裡邊放的就是對應各個伺服器的證書。到這裡,整個證書申請流程就算完了,接下來就是配置 Web 伺服器來支持網站的 HTTPS 訪問了。我這裡用的 Nginx 演示。
Nginx 平滑升級以支持 HTTPS
要想讓 Web伺服器支持 HTTPS ,首先你的伺服器肯定要支持 SSL ,所以我們先檢查 Nginx 是否支持 SSL :
/usr/local/nginx/sbin/nginx -V
通過命令顯示信息,我們看configure arguments
中是否有 -with-http_ssl_module
字樣,如果像我這樣沒有的話,你就需要重新編譯 Nginx 以支持 SSL 了。如果有,請跳過這步驟,直接看Nginx 配置 HTTPS 服務
那一節。
安裝 Nginx 可能大家都會,不會的可以看 從零開始學 Java - CentOS 下安裝 Nginx ,但是平滑升級 Nginx 可能你沒有體驗過,這樣說吧,線上上伺服器環境下,你要支持 HTTPS 訪問,但是你發現你的 Nginx 不支持 SSL ,你肯定不能卸載 Nginx 重新安裝時載入 SSL 模塊,因為那是線上伺服器。你只能在現有安裝的 Nginx 下進行無痛升級以以支持 SSL ,這就用到了 Nginx 的 平滑升級
概念。
找到你之前安裝 Nginx 時的編譯目錄,如果你和我一樣找不到或許刪除了,那我們就需要重新下載一個 Nginx 了,當然我們是通過 wget
方式,看命令:
wget -c https://nginx.org/download/nginx-1.10.1.tar.gz
tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1
配置,加入 SSL 模塊:
./configure --with-http_ssl_module
make
註意,千萬不能在像安裝的時候make install
了,因為我們這是升級。
備份原 Nginx 執行腳本
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
把新版本 Nginx 編譯腳本放到可執行文件目錄下
cd objs/
cp nginx /usr/local/nginx/sbin/
進行平滑升級,命令:
make upgrade
這時候會輸出這些信息:
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
沒問題之後接下來,查看現在目前版本及安裝模塊:
/usr/local/nginx/sbin/nginx -V
看到已經從 1.4.6 版本升級到了 1.10.1,而且這種升級不影響正常訪問的。線上環境操作也是可以的。
Nginx 配置 HTTPS 服務
編輯配置文件:
cd /usr/local/nginx/conf
vim nginx.conf
拉到最下麵,會看到 HTTPS 配置被註釋掉了。嗯,這是模板,我們就在這配置。
文字版:
server {
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;
location / {
root html;
index index.html index.htm;
}
}
把上面的ssl_certificate
和ssl_certificate_key
替換成你下載下來的證書存放路徑就行,記著下載下來的證書這種配置是放在/usr/local/nginx/conf
目錄下的,當然你也可以隨意放。
這時候,你就可以打開瀏覽器訪問一下試試了。正常情況 HTTPS 請求是打不開的,因為我們還沒設置防火牆,記得要開放443
埠!,嗯,設置過防火牆就可以正常訪問了吧。
其實到這裡,這個伺服器支持 HTTPS 請求流程已經結束了,但是你發現好多人在瀏覽器地址欄輸入功能變數名稱的時候都不輸入http://
或https://
的,因為瀏覽器會自動幫我們加上http://
的,所以,這時候輸入我們剛剛設置的功能變數名稱其實還是沒有走https://
請求,那怎麼讓就是輸入http://
也走HTTPS
呢?
很簡單,Nginx 中這樣配置就行啦!
server {
listen 80;
server_name www.domain.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
我們利用rewrite
來做跳轉。監聽到80
埠的 HTTP 請求後,就轉發到 HTTPS ,當然還有好多處理方式。
總結一下
這篇文章講了一下怎麼申請免費的 HTTPS 證書,然後利用 Nginx 伺服器來配置 HTTPS 請求訪問,並其中順手平滑升級 Nginx,如絲般順滑的升級,不影響正常訪問。HTTPS 方式的傳輸對我們網站來說應該是提高了一些安全性的,況且這種方式又很簡單,可以試著搞一搞。