為什么要使用 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 方式的傳輸對我們網站來說應該是提高了一些安全性的,況且這種方式又很簡單,可以試着搞一搞。