成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js 部署免費(fèi)/自動(dòng)續(xù)訂 HTTPS

seanlook / 1127人閱讀

摘要:當(dāng)時(shí)結(jié)合本站的部署經(jīng)驗(yàn),給大家詳細(xì)介紹了部署免費(fèi)。截止年月日,由實(shí)時(shí)統(tǒng)計(jì)報(bào)告顯示,在統(tǒng)計(jì)的多萬(wàn)活躍網(wǎng)站中,已經(jīng)有萬(wàn)約的站點(diǎn)部署了證書服務(wù)。

隨著互聯(lián)網(wǎng)快速發(fā)展,互聯(lián)網(wǎng)信息安全越來(lái)越受到大家重視,HTTPS 應(yīng)該是近兩年各大廠商都在盡力普及的技術(shù)之一。國(guó)內(nèi)大廠基本上已經(jīng)全面普及了 HTTPS。

本文首發(fā)于我的個(gè)人網(wǎng)站:聽說(shuō) - https://tasaid.com/,建議在我的個(gè)人網(wǎng)站閱讀,擁有更好的閱讀體驗(yàn)。

前端開發(fā) QQ 群:377786580
HTTPS 現(xiàn)狀

早在 2016 年底,我就寫過(guò) 《 從 HTTP 到 HTTPS 系列 》文章來(lái)講解 HTTPS。當(dāng)時(shí)結(jié)合本站的部署經(jīng)驗(yàn),給大家詳細(xì)介紹了 《 IIS 部署免費(fèi) HTTPS 》。

這篇文章就跟大家介紹一下 Node.js 如何部署免費(fèi) HTTPS 以及簡(jiǎn)單的部署 HTTP/2。

截止 2018 年 03 月 13 日,由 Let"s Encrypt 實(shí)時(shí)統(tǒng)計(jì)報(bào)告 顯示,在統(tǒng)計(jì)的 6930 多萬(wàn)活躍網(wǎng)站中,已經(jīng)有 5350 萬(wàn)(約 77%)的站點(diǎn)部署了 HTTPS 證書服務(wù)。

同時(shí) Google 透明度報(bào)告 - 網(wǎng)絡(luò)上的 HTTPS 加密 中,統(tǒng)計(jì)了使用 Chrome 瀏覽器,訪問的站點(diǎn)統(tǒng)計(jì)中,HTTPS 使用率的增長(zhǎng)情況:

而在今年 2 月份,Chrome 團(tuán)隊(duì)也宣布,將在 2018 年 7 月份發(fā)布的 Chrome 68 中,將沒有部署 HTTPS 的網(wǎng)站標(biāo)記為 "不安全"。

簡(jiǎn)而言之,HTTPS 大勢(shì)所趨。

Node.js 部署 HTTPS

早在 《 從 HTTP 到 HTTPS - IIS 部署免費(fèi) HTTPS 》一文中,我就指出了 Let"s Encrypt 免費(fèi)證書的優(yōu)勢(shì):

由 ISRG(Internet Security Research Group,互聯(lián)網(wǎng)安全研究小組)提供服務(wù),免費(fèi)、訪問速度快,穩(wěn)定等。

所以這次部署的證書也是圍繞 Let"s Encrypt 展開。

greenlock-express

由于 js 生態(tài)圈的繁華,所以想找一個(gè)現(xiàn)有的包是件很輕松的事情,greenlock-express 這個(gè)包就幫助我們封裝了 Let"s Enctrypt 證書的部署,只需要引入這個(gè)包并使用,就可以:

自動(dòng)注冊(cè) Let"s Encrypt 證書

自動(dòng)續(xù)訂( 80 天左右),且服務(wù)器無(wú)需重啟

支持虛擬主機(jī)

并且 greenlock 相關(guān)的證書生態(tài)圈十分完善,同樣有支持 koa 的 greenlock-koa。

安裝和使用

通過(guò) npm 安裝 greenlock-express

$ npm install --save [email protected]

使用起來(lái)非常簡(jiǎn)單,這是 greenlock-express 默認(rèn)提供的 demo:

const greenlock = require("greenlock-express")

require("greenlock-express").create({
  // 測(cè)試
  server: "staging",
  // 聯(lián)系郵箱
  email: "[email protected]",
  // 是否同意 Let"s Encrypt 條款... 這必須為 true 啊,不然走不下去
  agreeTos: true,
  // 申請(qǐng)的域名列表,不支持通配符
  approveDomains: [ "tasaid.com", "www.tasaid.com" ],
  // 綁定 express app
  app: require("express")().use("/", function (req, res) {
    res.end("Hello, World!");
  })
}).listen(80, 443)

證書存在 ~/letsencrypt。

當(dāng)然上面代碼只能用于測(cè)試/開發(fā)環(huán)境,因?yàn)樗]有申請(qǐng)一個(gè)有效的證書,而是生成了一個(gè)自簽名的證書(跟以前的 12306 自簽證書一樣),用于在開發(fā)環(huán)境中調(diào)試。

API

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

interface Options {
  /**
   * Express app
   */
  app: Express
  /*
   * 遠(yuǎn)程服務(wù)器
   * 測(cè)試環(huán)境中可用為 staging
   * 生產(chǎn)環(huán)境中為 https://acme-v01.api.letsencrypt.org/directory
   */
  server: string
  /**
   * 用于接收 let"s encrypt 協(xié)議的郵箱
   */
  email: string
  /**
   * 是否同意協(xié)議
   */
  agreeTos: boolean
  /**
   * 在注冊(cè)域名獲取證書前,會(huì)執(zhí)行這個(gè)回調(diào)函數(shù)
   * string[]: 一組需要注冊(cè)證書的域名
   * 函數(shù): 第一個(gè)參數(shù)跟 Options 格式差不多,第二個(gè)參數(shù)是當(dāng)前自動(dòng)獲取的域名信息,第三個(gè)參數(shù)是在處理完之后傳遞的回調(diào)函數(shù)
   */
  approveDomains: string[] | (opts, certs: cb) => any
  /**
   * 更新證書最大天數(shù) (以毫秒為單位)
   */
  renewWithin: number
  /**
   * 更新證書的最小天數(shù)(以毫秒為單位)
   */
  renewBy: number
}

經(jīng)過(guò)測(cè)試,在真實(shí)的生產(chǎn)環(huán)境中, approveDomains 必須為函數(shù),傳數(shù)組的話不會(huì)生效。

生產(chǎn)環(huán)境

生產(chǎn)環(huán)境中部署還需要做一些配置改動(dòng)和引入一些包。

更新包:

$ npm i --save [email protected]
$ npm i --save le-challenge-fs
$ npm i --save le-store-certbot
$ npm i --save redirect-https

生產(chǎn)代碼:

const greenlock = require("greenlock-express")
const express = require("express")

const app = express()


const lex = greenlock.create({
  // 注意這里要成這個(gè)固定地址
  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) {
      /*
       * 注意這里如果是這樣寫的話,一定要對(duì)域名做校驗(yàn)
       * 否則其他人可以通過(guò)將域名指向你的服務(wù)器地址,導(dǎo)致你注冊(cè)了其他域名的證書
       * 從而造成安全性問題
       */
      // 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 用于自動(dòng)將 HTTP 請(qǐng)求跳到 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
")
})

如果沒有生效,可以檢查下 ~/letsencrypt 的證書信息,和 443 端口是否打開。

部署 HTTP/2

HTTP/2 是 HTTP/1.1 的升級(jí)版,主要來(lái)說(shuō)改進(jìn)了這些地方:

二進(jìn)制協(xié)議:采用二進(jìn)制流

多路復(fù)用:一次請(qǐng)求多次復(fù)用管道

服務(wù)器推送:解決 HTTP/1.x 時(shí)代最大的痛點(diǎn)

值的注意的是,HTTP/2 是支持 HTTP 協(xié)議的,只不過(guò)瀏覽器廠商都不愿意支持 HTTP,所以基本上可以認(rèn)為,用上 HTTP/2 的前置條件是必須部署 HTTPS。

SPDY

早在 2009 年,Google 開發(fā)了一個(gè)實(shí)驗(yàn)性協(xié)議,叫做 SPDY,目的解決 HTTP/1.x 中的一些設(shè)計(jì)缺陷。在 SPDY 發(fā)布幾年后,這個(gè)新的實(shí)驗(yàn)性協(xié)議得到了 Chrome、Firefox 和 Opera 的支持,應(yīng)用越來(lái)越廣泛。然后 HTTP 工作組 (HTTP-WG) 在這個(gè) SPDY 的基礎(chǔ)上,設(shè)計(jì)了 HTTP/2,所以可以說(shuō) SPDY 是 HTTP/2 的前身。

關(guān)于 HTTP/2 的詳情可以參考 這篇文章。

部署 HTTP/2

引入 HTTP/2Node.js 中也十分簡(jiǎn)單,只需要引入 spdy 包即可:

$ npm i --save spdy

然后我們把上一節(jié)的代碼做一點(diǎn)修改即可支持 HTTP/2:

const greenlock = require("greenlock-express")
const express = require("express")
// HTTP/2
const spdy = require("spdy")

const app = express()


const lex = greenlock.create({
  // 注意這里要成這個(gè)固定地址
  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) {
      /*
       * 注意這里如果是這樣寫的話,一定要對(duì)域名做校驗(yàn)
       * 否則其他人可以通過(guò)將域名指向你的服務(wù)器地址,導(dǎo)致你注冊(cè)了其他域名的證書
       * 從而造成安全性問題
       */
      // 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 用于自動(dòng)將 HTTP 請(qǐng)求跳到 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())}`)
})

至于 HTTP/2 相關(guān)的技術(shù)應(yīng)用,會(huì)在后續(xù)篇幅中再為大家講解。

本文首發(fā)于我的個(gè)人網(wǎng)站:聽說(shuō) - https://tasaid.com/,建議在我的個(gè)人網(wǎng)站閱讀,擁有更好的閱讀體驗(yàn)。

前端開發(fā) QQ 群:377786580

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/11345.html

相關(guān)文章

  • 10分鐘搭建ubuntu+nodejs+pm2自動(dòng)部署+nginx+永久免費(fèi)SSL證書+mongod

    摘要:將第二步中的安裝源換成阿里云的鏡像安裝會(huì)比較快,如下將上面的部分替換如下更新源正式安裝常用命令本地和服務(wù)器使用公鑰免密訪問倉(cāng)庫(kù)在使用協(xié)議訪問項(xiàng)目倉(cāng)庫(kù)之前,需要先配置好賬戶項(xiàng)目的公鑰。 如果你對(duì)nodejskoa2vuejs等感興趣,請(qǐng)加QQ群:732189938 或者直接點(diǎn)擊鏈接加入群聊【Node.js/Koa2/vuejs】:https://jq.qq.com/?_wv=1027&k...

    godlong_X 評(píng)論0 收藏0
  • 10分鐘搭建ubuntu+nodejs+pm2自動(dòng)部署+nginx+永久免費(fèi)SSL證書+mongod

    摘要:將第二步中的安裝源換成阿里云的鏡像安裝會(huì)比較快,如下將上面的部分替換如下更新源正式安裝常用命令本地和服務(wù)器使用公鑰免密訪問倉(cāng)庫(kù)在使用協(xié)議訪問項(xiàng)目倉(cāng)庫(kù)之前,需要先配置好賬戶項(xiàng)目的公鑰。 如果你對(duì)nodejskoa2vuejs等感興趣,請(qǐng)加QQ群:732189938 或者直接點(diǎn)擊鏈接加入群聊【Node.js/Koa2/vuejs】:https://jq.qq.com/?_wv=1027&k...

    YuboonaZhang 評(píng)論0 收藏0
  • cdhelasticsearch介紹

      cdhelasticsearch是Amazon Elasticsearch Service的命令行界面(CLI)工具。它可以幫助您在本地系統(tǒng)上管理和使用您的Amazon Elasticsearch集群cdhelasticsearch是一個(gè)開源工具,可以在GitHub上免費(fèi)下載。它使用Node.js開發(fā),并在命令行中運(yùn)行?! ∈褂胏dhelasticsearch,您可以執(zhí)行以下操作:  創(chuàng)建、...

    白馬嘯西風(fēng) 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

seanlook

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<