這次帶給大家Node.js怎麼部署HTTPS,Node.js部署HTTPS的注意事項有哪些,下面就是實戰案例,一起來看一下。
隨著網路快速發展,網路資訊安全越來越受到大家重視,HTTPS
應該是近兩年各大廠商都在盡力普及的技術之一。國內大廠基本上已經全面普及了 HTTPS。
HTTPS 現況
這篇文章就跟大家介紹一下Node.js
如何部署免費HTTPS
以及簡單的部署HTTP/ 2
。
截止2018 年03 月13 日,由Let's Encrypt 即時統計報告顯示,在統計的6930 多萬活躍網站中,已經有5350 萬(約77%)的站點部署了HTTPS
憑證服務。
同時Google 透明度報告- 網路上的HTTPS 加密中,統計了使用Chrome 瀏覽器,存取的網站統計中,HTTPS 使用率的成長情況:
而在今年2 月份,Chrome 團隊也宣布,將在2018 年7 月份發布的Chrome 68 中,將沒有部署HTTPS 的網站標記為"不安全"。
簡而言之,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
憑證的部署,只需要引入這個套件並使用,就可以:
自動註冊
Let's Encrypt
憑證自動續訂( 80 天左右),且伺服器無需重新啟動
#支援虛擬主機
並且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-express
的create(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 的升級版,主要來說改進了這些地方:
二元協定:採用二進位流
多路復用:一次請求多次重複使用管道
服务器推送:解决 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/2
在 Node.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中文网其它相关文章!
推荐阅读:
以上是Node.js怎麼部署HTTPS的詳細內容。更多資訊請關注PHP中文網其他相關文章!

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Atom編輯器mac版下載
最受歡迎的的開源編輯器