目錄
HTTPS 現況
Node.js 部署HTTPS
greenlock-express
安裝和使用
API
在生產環境
部署HTTP/2
SPDY
部署 HTTP/2
首頁 web前端 js教程 Node.js怎麼部署HTTPS

Node.js怎麼部署HTTPS

Mar 19, 2018 pm 05:04 PM
https javascript node.js

這次帶給大家Node.js怎麼部署HTTPS,Node.js部署HTTPS的注意事項有哪些,下面就是實戰案例,一起來看一下。

隨著網路快速發展,網路資訊安全越來越受到大家重視,HTTPS 應該是近兩年各大廠商都在盡力普及的技術之一。國內大廠基本上已經全面普及了 HTTPS。

HTTPS 現況

這篇文章就跟大家介紹一下Node.js 如何部署免費HTTPS 以及簡單的部署HTTP/ 2

截止2018 年03 月13 日,由Let's Encrypt 即時統計報告顯示,在統計的6930 多萬活躍網站中,已經有5350 萬(約77%)的站點部署了HTTPS 憑證服務。

lets encrypt stats

同時Google 透明度報告- 網路上的HTTPS 加密中,統計了使用Chrome 瀏覽器,存取的網站統計中,HTTPS 使用率的成長情況:

google stats

而在今年2 月份,Chrome 團隊也宣布,將在2018 年7 月份發布的Chrome 68 中,將沒有部署HTTPS 的網站標記為"不安全"。

chrome 68 status

簡而言之,HTTPS 大勢所趨。

Node.js 部署HTTPS

早在《 從HTTP 到HTTPS - IIS 部署免費HTTPS 》一文中,我就指出了Let's Encrypt 免費憑證的優勢:

#由ISRG(Internet Security Research Group,網路安全研究小組)提供服務,免費、存取速度快,穩定等。

所以這次部署的憑證也是圍繞著 Let's Encrypt 展開。

greenlock-express

由於js 生態圈的繁華,所以想找一個現有的包是件很輕鬆的事情,greenlock-express 這個包就幫我們封裝了 Let's Enctrypt 憑證的部署,只需要引入這個套件並使用,就可以:

  1. 自動註冊Let's Encrypt 憑證

  2. 自動續訂( 80 天左右),且伺服器無需重新啟動

  3. #支援虛擬主機

並且greenlock 相關的證書生態圈十分完善,同樣有支援koa 的greenlock-koa。

安裝和使用

透過npm 安裝greenlock-express

$ npm install --save greenlock-express@2.x
登入後複製

使用起來非常簡單,這是greenlock-express 預設提供的demo:

const greenlock = require('greenlock-express')
require('greenlock-express').create({
  // 测试
  server: 'staging',
  // 联系邮箱
  email: 'john.doe@example.com',
  // 是否同意 Let's Encrypt 条款... 这必须为 true 啊,不然走不下去
  agreeTos: true,
  // 申请的域名列表,不支持通配符
  approveDomains: [ 'tasaid.com', 'www.tasaid.com' ],
  // 绑定 express app
  app: require('express')().use('/', function (req, res) {
    res.end('Hello, World!');
  })
}).listen(80, 443)
登入後複製

憑證存在~/letsencrypt

當然上面程式碼只能用於測試/開發環境,因為它並沒有申請一個有效的證書,而是產生了一個自簽名的證書(跟以前的12306 自簽證書一樣),用於在開發環境中調試。

API

greenlock-expresscreate(options) 函數參數簽名如下:

interface Options {
  /**
   * Express app
   */
  app: Express
  /*
   * 远程服务器
   * 测试环境中可用为 staging
   * 生产环境中为 https://acme-v01.api.letsencrypt.org/directory
   */
  server: string
  /**
   * 用于接收 let's encrypt 协议的邮箱
   */
  email: string
  /**
   * 是否同意协议
   */
  agreeTos: boolean
  /**
   * 在注册域名获取证书前,会执行这个回调函数
   * string[]: 一组需要注册证书的域名
   * 函数: 第一个参数跟 Options 格式差不多,第二个参数是当前自动获取的域名信息,第三个参数是在处理完之后传递的回调函数
   */
  approveDomains: string[] | (opts, certs: cb) => any
  /**
   * 更新证书最大天数 (以毫秒为单位)
   */
  renewWithin: number
  /**
   * 更新证书的最小天数(以毫秒为单位)
   */
  renewBy: number
}
登入後複製

經過測試,在真實的生產環境中, approveDomains 必須為函數,傳數組的話不會生效。

在生產環境

在生產環境中部署還需要做一些配置變更和引入一些套件。

更新套件:

$ npm i --save greenlock-express@2.x
$ npm i --save le-challenge-fs
$ npm i --save le-store-certbot
$ npm i --save redirect-https
登入後複製

生產代碼:

const greenlock = require('greenlock-express')
const express = require('express')
const app = express()
const lex = greenlock.create({
  // 注意这里要成这个固定地址
  server: 'https://acme-v01.api.letsencrypt.org/directory',
  challenges: { 
    'http-01': require('le-challenge-fs').create({ webrootPath: '~/letsencrypt/var/acme-challenges' }) 
  },
  store: require('le-store-certbot').create({ 
    webrootPath: '~/letsencrypt/srv/www/:hostname/.well-known/acme-challenge' 
  }),
  approveDomains: (opts: any, certs: any, cb: any) => {
    appLog.info('approveDomains', { opts, certs })
    if (certs) {
      /*
       * 注意这里如果是这样写的话,一定要对域名做校验
       * 否则其他人可以通过将域名指向你的服务器地址,导致你注册了其他域名的证书
       * 从而造成安全性问题
       */
      // opts.domains = certs.altnames
      opts.domains = [ 'tasaid.com', 'www.tasaid.com' ]
    } else {
      opts.email = '你的邮箱@live.com'
      opts.agreeTos = true
    }
    cb(null, { options: opts, certs: certs })
  },
})
// 这里的 redirect-https 用于自动将 HTTP 请求跳到 HTTPS 上
require('http').createServer(
  lex.middleware(
    require('redirect-https')()
   )
  ).listen(80, function () {
    console.log('Listening', `for ACME http-01 challenges on: ${JSON.stringify(this.address())}`)
})
// 绑定 HTTPS 端口
require('https').createServer(
    lex.httpsOptions, 
    lex.middleware(app)
  ).listen(443, function () {
    console.log(('App is running at http://localhost:%d in %s mode'), app.get('port'), app.get('env'))
    console.log('Press CTRL-C to stop\n')
})
登入後複製

如果沒有生效,可以檢查下~/letsencrypt 的憑證信息,和443 連接埠是否打開。

部署HTTP/2

HTTP/2 是HTTP/1.1 的升級版,主要來說改進了這些地方:

  1. 二元協定:採用二進位流

  2. 多路復用:一次請求多次重複使用管道

  3. 服务器推送:解决 HTTP/1.x 时代最大的痛点

值的注意的是,HTTP/2 是支持 HTTP 协议的,只不过浏览器厂商都不愿意支持 HTTP,所以基本上可以认为,用上 HTTP/2 的前置条件是必须部署 HTTPS。

SPDY

早在 2009 年,Google 开发了一个实验性协议,叫做 SPDY,目的解决 HTTP/1.x 中的一些设计缺陷。在 SPDY 发布几年后,这个新的实验性协议得到了 Chrome、Firefox 和 Opera 的支持,应用越来越广泛。然后 HTTP 工作组 (HTTP-WG) 在这个 SPDY 的基础上,设计了 HTTP/2,所以可以说 SPDY 是 HTTP/2 的前身。

关于 HTTP/2 的详情可以参考 这篇文章。

部署 HTTP/2

引入 HTTP/2Node.js 中也十分简单,只需要引入 spdy 包即可:

$ npm i --save spdy
登入後複製

然后我们把上一节的代码做一点修改即可支持 HTTP/2:

const greenlock = require('greenlock-express')
const express = require('express')
// HTTP/2
const spdy = require('spdy')
const app = express()
const lex = greenlock.create({
  // 注意这里要成这个固定地址
  server: 'https://acme-v01.api.letsencrypt.org/directory',
  challenges: { 
    'http-01': require('le-challenge-fs').create({ webrootPath: '~/letsencrypt/var/acme-challenges' }) 
  },
  store: require('le-store-certbot').create({ 
    webrootPath: '~/letsencrypt/srv/www/:hostname/.well-known/acme-challenge' 
  }),
  approveDomains: (opts: any, certs: any, cb: any) => {
    appLog.info('approveDomains', { opts, certs })
    if (certs) {
      /*
       * 注意这里如果是这样写的话,一定要对域名做校验
       * 否则其他人可以通过将域名指向你的服务器地址,导致你注册了其他域名的证书
       * 从而造成安全性问题
       */
      // opts.domains = certs.altnames
      opts.domains = [ 'tasaid.com', 'www.tasaid.com' ]
    } else {
      opts.email = '你的邮箱@live.com'
      opts.agreeTos = true
    }
    cb(null, { options: opts, certs: certs })
  },
})
// 这里的 redirect-https 用于自动将 HTTP 请求跳到 HTTPS 上
require('http').createServer(
  lex.middleware(
    require('redirect-https')()
   )
  ).listen(80, function () {
    console.log('Listening', `for ACME http-01 challenges on: ${JSON.stringify(this.address())}`)
})
// HTTP/2
spdy.createServer(lex.httpsOptions, lex.middleware(app)).listen(443, function () {
  console.log('Listening https', `for ACME tls-sni-01 challenges and serve app on: ${JSON.stringify(this.address())}`)
})
登入後複製

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

正则表达式怎么在字符串中提取数字

React中有哪些类定义组件

以上是Node.js怎麼部署HTTPS的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

tomcat如何配置https tomcat如何配置https Jan 05, 2024 pm 05:15 PM

設定步驟:1、取得SSL憑證;2、設定SSL憑證;3、編輯Tomcat設定檔;4、重啟Tomcat。詳細介紹:1、需要取得SSL證書,可以自簽名證書,也可以從認證機構(如Let's Encrypt)取得有效的SSL證書;2、將取得的SSL證書和私鑰檔案放置在伺服器上,確保這些文件位於安全的位置,只有具有足夠權限的使用者可以存取;3、編輯Tomcat設定檔等等。

See all articles