Node.js + Nginx 部署 HTTPS 服務

今天,通過無數次折騰,嚮往已久的域名備案終於下來了。因而火燒眉毛地將我的博客網站進行 HTTPS 部署遷移,中間遇到一些坑,在此作個記錄。css

緣由

之因此要將網站從 http 遷移到 https,緣由有:前端

  • https 更安全,相對於 http 能夠較爲有效防止中間人攻擊,每一個項目都但願安全託底。博客雖然沒有重要數據,但不失爲練兵的好地方。
  • 現在 HTTP2 愈來愈受人關注,它能夠提升訪問速度,而 HTTP2 的前提就是 HTTPS

步驟

  1. 安裝證書
  2. nginx 反向代理
  3. 更改前端鏈接方式

安裝證書

爲何須要證書?這和 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 Certbotios

在官網上有詳細的說明。個人環境是 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 進行鏈接,解決該問題,能夠:

  • 使用 axios,簡單優雅處理

最後

整個過程寫的比較亂,緣由仍是本身對 SSL/TLS 的底層協議不熟悉,並且 Nginx 也是新學,反向代理以前只有所耳聞,並無實際操做過。但不得的說,Nginx 的配置方式比較友好,一看就明白它是什麼意思。因此配置起來也不復雜。

接下去會把這部分在深刻一點,寫一個系列吧。

相關文章
相關標籤/搜索