统计了使用 Chrome 浏览器,访问的站点统计中,HTTPS 使用率的增长情况:

而在今年 2 月份,Chrome 团队也宣布,将在 2018 年 7 月份发布的 Chrome 68 中,将没有部署 HTTPS 的网站标记为 "不安全"。

简而言之,HTTPS 大势所趋。

Node.js 部署 HTTPS

由 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 appapp: 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.altnamesopts.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/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.altnamesopts.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())}`)
})

至于 HTTP/2 相关的技术应用,会在后续篇幅中再为大家讲解。

Node.js 部署免费/自动续订 HTTPS相关推荐

  1. 【华为云技术分享】如何快速实现鲲鹏弹性云服务器Node.js部署和高可用性?

    "Node 开发者容易面临的前三大困惑分别是异步编程.事件驱动以及 Debug.同时,文档是大家最期待的资源,新人对视频教程和免费在线课程的呼声最高."这份<2020 年 N ...

  2. 使用Node.js部署智能合約(Smart Contract)

    從智能合約原始檔.編譯.部署,一氣呵成 我想大部分的人應該都是為了寫智能合約(Smart Contract)而選擇使用Ethereum,在開發應用程式(Dapp)時,若能透過程式碼自動部署智能合約,就 ...

  3. Linux使用node.js部署react.js到腾讯云

    最近在学习react.js的相关内容,为了怕以后忘记,就简单地写一下做个笔记. 准备 1项目打包 2把打包的build文件上传至服务器 3在服务器上安装nodejs 和npm工具 1部署Nodejs ...

  4. acme.sh免费自动更新https证书

    一.前言 本文旨在提供免费更新https证书的方案,原本使用的是certbot-auto,由于certbot-auto已被弃用,寻找了acme.sh来解决配置https的问题. 二.sh-acme 1 ...

  5. node js 部署相关

    2019独角兽企业重金招聘Python工程师标准>>> 部署 由于公司的测试环境无法访问互联网,所以先在开发电脑(Windows7)上用 npm install --save xxx ...

  6. node ajax配置文件,如何存储Node.js部署设置/配置文件?

    我将a package.json用于我的程序包,并将a config.js用于我的配置,如下所示: var config = {}; config.twitter = {}; config.redis ...

  7. 通过新浪云部署NideShop微信小程序商城(基于Node.js+MySQL+ThinkJS)

    本文档为微信小程序商城NideShop项目的安装部署教程(GitHub),欢迎star 一.购买新浪云SAE 为什么选择SAE? 免费二级域名和支持https访问,不用备案,可用于做微信小程序服务器. ...

  8. 新浪云node加mysql_通过新浪云部署NideShop微信小程序商城(基于Node.js+MySQL+ThinkJS)...

    一.购买新浪云SAE为什么选择SAE? 免费二级域名和支持https访问,不用备案,可用于做微信小程序服务器. 选择对应的部署环境 自定义 -> 开发言语:自定义 -> 运行环境:云容器 ...

  9. npm环境安装linux,Node.js环境在linux上的部署教程

    我们以centOS为例来说说如何部署node.js环境 一 打开centos,然后开始下载node.js包 curl --silent --location https://rpm.nodesourc ...

最新文章

  1. 程序员霸榜 2020 年十大高薪岗位,不料幸福度却垫底了!
  2. 第53天:鼠标事件、event事件对象
  3. php-fpm启动后没有监听端口9000
  4. linux vg lv pv
  5. [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List
  6. html多级折叠菜单表单,JS实战篇之收缩菜单表单布局
  7. java 字母随机数_java如何生成指定长度的随机数字和英文的字符串
  8. fedora 安装google浏览器失败,报错
  9. svn更新项目时遇到被锁住的问题
  10. 汉仪股份通过注册:年营收2.2亿 谢立群控制公司35%股权
  11. Spring Validation 验证框架全面总结
  12. 腾讯+android+hotfix,发布到安卓平台报这个错误,xLua exception : xlua.access, no field __Hotfix0_Update...
  13. 小米4c一直显示无服务器,小米路由器4C不能上网(连不上网)怎么办?
  14. android 系统重新安装程序,Android应用程序更新时的安装与卸载(调用系统方法)...
  15. 汉诺塔游戏c语言作业,C语言实现汉诺塔游戏.pdf
  16. SEM和SD的区别和联系,以及其计算方法(实际作图方法)
  17. ImageIo类常用方法以及图片操作
  18. linux 手机 rom image,安卓手机刷机界面image 文件夹什么意思 里面的文件都是什么作用...
  19. 使用WinWedge软件记录satorius天平的数据(记录)
  20. case when then else end 语句遇上sum或count等统计函数的注意事项(列转行)

热门文章

  1. 数学--数论--四大定理之威尔逊定理
  2. 【三分钟讲清区块链/比特币】之一:区块链入门教程
  3. kickstart research
  4. Adopting Modern Objective-C
  5. 统计学习方法(一)统计学习方法概论
  6. raspberry pi_通过串行蓝牙从Raspberry Pi传感器单元发送数据
  7. Waveform Audio 驱动(Wavedev2)之:WAV API模拟
  8. java 字符串子串_java实现字符串匹配求两个字符串的最大公共子串
  9. python的open方法_Python os.open() 方法
  10. arccatalog点要素显示不完_如果你读不完显示屏说明书,至少读完这几句话吧