nginx配置SSL證書實現https服務

在前面一篇文章中,使用openssl生成了免費證書 後,咱們如今使用該證書來實現咱們本地node服務的https服務需求。假如我如今node基本架構以下:html

|----項目
| |--- static         # 存放html文件
| | |--- index.html   # index.html
| |--- node_modules   # 依賴包
| |--- app.js         # node 入口文件
| |--- package.json  
| |--- .babelrc       # 轉換es6文件

index.html 文件代碼以下:node

<!DOCTYPE html>
<html>
<head>
  <meta charset=utf-8>
  <meta name="referrer" content="never">
  <title>nginx配置https</title>
</head>
<body>
  <div>
    <h2>歡迎使用https來訪問頁面</h2>
  </div>
</body>
</html>

app.js 代碼以下:nginx

const Koa = require('koa');
const fs = require('fs');
const path = require('path');
const router = require('koa-router')();
const koaBody = require('koa-body');
const static = require('koa-static');

const app = new Koa();

router.get('/', (ctx, next) => {
  // 設置頭類型, 若是不設置,會直接下載該頁面
  ctx.type = 'html';
  // 讀取文件
  const pathUrl = path.join(__dirname, '/static/index.html');
  ctx.body = fs.createReadStream(pathUrl);
  next();
});

app.use(static(path.join(__dirname)));

app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3001, () => {
  console.log('server is listen in 3001');
});

package.json 代碼以下;git

{
  "name": "uploadandload",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "dev": "nodemon ./app.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "fs": "0.0.1-security",
    "koa": "^2.7.0",
    "koa-body": "^4.1.0",
    "koa-router": "^7.4.0",
    "koa-send": "^5.0.0",
    "koa-static": "^5.0.0",
    "nodemon": "^1.19.0",
    "path": "^0.12.7"
  }
}

而後我在項目的根目錄下執行 npm run dev 後,就能夠在瀏覽器下訪問 http://localhost:3001 了,可是爲了我想使用域名訪問的話,所以咱們能夠在 hosts文件下綁定下域名,好比叫 xxx.abc.com . hosts文件以下綁定:es6

127.0.0.1  xxx.abc.com

所以這個時候咱們使用 http://xxx.abc.com:3001/ 就能夠訪問頁面了,以下所示:github

如上所示,咱們就能夠訪問頁面了,可是咱們有沒有發現,在chrome瀏覽器下 顯示http請求是不安全的,所以這個時候我想使用https來訪問就行了,網頁的安全性就獲得了保障,可是這個時候若是我什麼都不作,直接使用https去訪問的話是不行的,好比地址:https://xxx.abc.com:3001. 以下圖所示:
web

咱們知道使用https訪問的話,通常是須要安全證書的,所以咱們如今的任務是須要使用nginx來配置下安全證書之類的事情,而後使用https能訪問網頁就能達到目標。
若是想要學習nginx基本安裝及基本知識點,請看我以前的這篇文章算法

nginx配置https服務 chrome

1. 首先進入nginx目錄下,使用命令:cd /usr/local/etc/nginx。而後在該目錄下建立 cert文件夾,目的是存放證書文件。
使用命令:mkdir cert 以下所示:npm

2. 而後咱們須要把證書相關的文件,好比server.crt 和 server.key 文件複製到該 cert目錄下。好比以下證書文件:

至於如上證書是如何生存的,能夠請看我上篇文字 使用openssl 生存免費證書

移動命令:mv server.key /usr/local/etc/nginx/cert, 好比把server.key 和 server.crt文件都移動到 /usr/local/etc/nginx/cert目錄下。以下圖所示:

而後咱們再查看下 /usr/local/etc/nginx/cert 目錄下,有以下文件,以下所示:

3. nginx的配置

nginx的配置須要加上以下代碼:

server {
  listen       443 ssl;
  server_name    xxx.abc.com;
  ssl on;  // 該配置項須要去掉
  ssl_certificate      cert/server.crt;
  ssl_certificate_key  cert/server.key;
  /*
   設置ssl/tls會話緩存的類型和大小。若是設置了這個參數通常是shared,buildin可能會參數內存碎片,默認是none,和off差很少,停用緩存。如shared:SSL:10m表示我全部的nginx工做進程共享ssl會話緩存,官網介紹說1M能夠存放約4000個sessions。
  */
  ssl_session_cache    shared:SSL:1m;
  // 客戶端能夠重用會話緩存中ssl參數的過時時間,內網系統默認5分鐘過短了,能夠設成30m即30分鐘甚至4h。
  ssl_session_timeout  5m;

  /*
   選擇加密套件,不一樣的瀏覽器所支持的套件(和順序)可能會不一樣。
   這裏指定的是OpenSSL庫可以識別的寫法,你能夠經過 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(後面是你所指定的套件加密算法) 來看所支持算法。
  */
  ssl_ciphers  HIGH:!aNULL:!MD5;

  // 設置協商加密算法時,優先使用咱們服務端的加密套件,而不是客戶端瀏覽器的加密套件。
  ssl_prefer_server_ciphers  on;

  location / {
    proxy_pass http://localhost:3001;
  }
}

注意:如上 ssl on; 這個配置項須要去掉。假如是如上的配置後,我從新啓動下nginx命令會報錯,以下所示:

SSL: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt error:0906A065:PEM routines:PEM_do_header:bad decrypt 相似這樣的錯,而後經過百度搜索這個錯誤,經過以下方法能夠解決:

進入到該目錄下:cd /usr/local/etc/nginx/cert 而後執行下面兩句代碼便可:

cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

以下所示:

能夠看百度搜索出來的頁面(http://ju.outofmemory.cn/entry/17732)

而後當我繼續重啓下 nginx, 發現還會報錯,報錯信息以下:

nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead 

而後繼續把 ssl on; 這句配置項去掉就能夠了,可能和nginx的版本有關係,請看這篇文章(https://blog.csdn.net/ootw/article/details/81059677).

如今我繼續重啓下nginx就ok了,以下所示:

可是如上配置後,咱們還不能直接 使用 域名 https://xxx.abc.com/ 訪問了,咱們還須要在瀏覽器下把本身以前生成的client.crt 證書安裝上去,在mac系統下操做步驟以下:

1. 點擊以下啓動臺。以下所示:

2. 搜索鑰匙串訪問,點擊進去,以下所示

3. 進入到證書頁面,把咱們以前的client.crt證書拖進到證書裏面去便可,好比我以前生成的 client.crt證書,以下所示:

4. 右鍵點擊個人證書,而後點擊 "顯示簡介", 進入到證書詳情頁面後。以下圖所示:

5. 進入頁面後,使用證書時,選擇始終信任後,以下圖所示:

6. 而後退出,可能須要輸入電腦開機密碼,輸入完成,會自動保存。而後咱們在瀏覽器訪問該 https://xxx.abc.com/ 頁面後就能夠訪問的到了。以下所示:

而後咱們點擊繼續訪問便可看到頁面了,以下所示:

如上就是使用 nginx + 證書 實現 本地node https服務了。

可是如上https雖然能夠訪問,可是https前面仍是顯示不安全的文案; 以下圖所示:

可能的緣由該證書是本身生成的證書,不是購買第三方的證書致使的吧。具體啥緣由,目前我也不知道,至少如今咱們可使用https來訪問咱們的項目了。
github上簡單node服務啓動的源碼

相關文章
相關標籤/搜索