今天,通過無數次折騰,嚮往已久的域名備案終於下來了。因而火燒眉毛地將我的博客網站進行 HTTPS 部署遷移,中間遇到一些坑,在此作個記錄。css
之因此要將網站從 http 遷移到 https,緣由有:前端
- 安裝證書
- nginx 反向代理
- 更改前端鏈接方式
爲何須要證書?這和 HTTPS 協議的設計有關。 HTTPS,指的是 Hypertext Transfer Protocol Secure,另外也也能夠稱爲 HTTP over SSL 或者 HTTP over TLS。通俗一點,HTTPS 經過 Http 協議傳輸數據,SSL/TLS 加密數據。vue
它是如何實現加密的呢?node
首先,瀏覽器廠商預先安裝了各個 證書頒發機構
的證書,用於對訪問網站進行安全驗證 而後,我的向 證書頒發機構
申請我的證書,並將證書應用於服務器配置中。 以後瀏覽器訪問服務器,獲取公鑰,將其與已有的證書列表匹配,決定是否繼續。 若是經過,瀏覽器經過公鑰與服務器通訊,協商兩個非對稱私鑰,用於各自的數據傳輸加密,從而創建的加密通道,防止中間人竊聽。python
如何安裝證書? 向證書頒發機構申請證書便可。目前的機構有Symantec、Comodo、GoDaddy 以及 Let's Certbot。這裏咱們選擇免費的 Let's Certbot。ios
在官網上有詳細的說明。個人環境是 Linux 16.04 Nginx
,其餘的環境能夠參照官網說明:nginx
#####安裝:git
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx
複製代碼
$ sudo certbot --nginx certonly
複製代碼
能夠參考 這裏github
根據提示,順利安裝完畢。這裏有個前提,就是服務器要有域名,而國內的域名都須要按照工信部要求備案,這也是爲何我須要等待大半個月的緣由。axios
證書安裝完畢,若是部署在 nginx 中的是靜態頁面,那麼此刻已經順利部署了 HTTPS 服務。可是更多的應用場景中,咱們一方面提供靜態服務,如 img、js、css 等等,另外一方面咱們也須要 REST 服務。 可是此刻,當咱們經過 axios 或者 vue-resource 這樣的 HTTP client 庫來訪問 Node.js 服務 API 來獲取數據,發現瀏覽器禁止了該鏈接。緣由是在部署 HTTPS 服務後,整站都要使用 https 來進行數據傳遞,包括資源的獲取,GET/POST
請求等等。
如何解決?我在這走了一些彎路。當時想,由於是訪問 Node.js 服務器的 API,我知道 Node.js 是支持 HTTPS 服務的,因此想固然在 Node 中使用 Openssl
來進行自認證。網上有不少相似的教程,可是在瀏覽器中,對於自認證的證書並不承認。因此這種方法可行但不適用於其餘用戶訪問,更不能應用於生產環境。這裏推薦幾個工具:
第一個是能夠發送模擬瀏覽器發送各類請求,對於測試 API 來講十分方便 第二個之因此在這裏推薦是由於我一開始使用 Chrome,但給出的錯誤提示很模糊,而 Firefox 在 Network 中對於 Request/Response 錯誤信息會更直白,在這個問題上幫了我不少忙。
正是 Firefox 給出的提示:xxxx 提供了不支持的自簽名證書..
,我知道自簽名走不通,因而往 Nginx 上考慮了一下,想到 nginx 有反向代理功能,若是說,作一個 api 的反向代理,導航到 node 服務端口,會不會有用呢?因而在網上查找了 Nginx 反向代理的教程,操做以下:
在 /ete/nginx/site-available/default
中:
location /api {
proxy_pass http://localhost:8089;
proxy_buffering on;
}
複製代碼
重啓 nginx,重啓 node 服務。
success!
這樣,咱們經過反向代理讓 REST 服務無需擔憂證書問題,由於 Nginx 已經作了這一部分工做。
這一部分可選,由於我以前使用的是 vue-resource
,鏈接使用 this.$http
因此沒法對 HTTPS 進行鏈接,解決該問題,能夠:
整個過程寫的比較亂,緣由仍是本身對 SSL/TLS 的底層協議不熟悉,並且 Nginx 也是新學,反向代理以前只有所耳聞,並無實際操做過。但不得的說,Nginx 的配置方式比較友好,一看就明白它是什麼意思。因此配置起來也不復雜。
接下去會把這部分在深刻一點,寫一個系列吧。