Koa2 引入ssl证书, 实现https协议API

随着技术的发展, 我们的前端页面采用https协议传输, 这是几乎是必然的.
将来的网页甚至可能强制使用https(苹果已经开始这样做了)
因此后端暴露的API接口也应该使用https. 否则有些浏览器会报出协议不一致的错误.net::ERR_SSL_PROTOCOL_ERROR错误
解决这个问题最佳的方法是: 我们的koa2后端应用程序暴露https协议API接口,前端直接发送https头的请求

一. 安装https、koa-sslify、fs库

npm i -S https fs koa-sslify

koa-sslify
koa-sslify是实施HTTPS中间件, 可对任何传入请求强制实施HTTPS连接。
在未加密的HTTP请求的情况下,koa-sslify会使用301 permanent redirect (或可选地307 Temporary Redirect)自动重定向到HTTPS地址。

二. 使用koa-sslify强制使用https

在app.js中引入koa-sslify并使用

const sslify = require('koa-sslify').default

app.use(sslify())

三. 配置SSL证书

我们下载下来的SSL证书中,存在一套通用的key/pem文件,我们使用它们就可以

我们使用FTP工具把它们上传至后端项目中: 这里我新建了一个ssl文件夹专门存放这些文件

image.png

四. 创建https监听服务, 实现https协议的加密/解密访问

在 ./bin/www配置文件中,引入https库和fs库

var fs = require('fs');
const https = require('https')

设置配置选项

const options = {
  key: fs.readFileSync('ssl/xxxxyun.com.key'),
  cert: fs.readFileSync('ssl/xxxxyun.com.pem'),
}

创建https服务

https.createServer(options, app.callback()).listen(3001, (err) => {
  if (err) {
    console.log('server error: ', err);
  } else {
    console.log('server at' + 3001);
  } 
});

现在, 我们再使用https获取koa2 API就已经成功了😊

此外,由于koa-sslify强制使用https访问, 之前默认的3000端口没用了, 直接吧3000端口改为https吧.
附: 最终的bin/www

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('demo:server');
var http = require('http');
var fs = require('fs');

// 引入https
const https = require('https')
/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
// app.set('port', port);

/**
 * Create HTTP server.
 */

// var server = http.createServer(app.callback());

/**
 * Listen on provided port, on all network interfaces.
 */

// server.listen(port);
// server.on('error', onError);
// server.on('listening', onListening);


const options = {
  key: fs.readFileSync('ssl/xxxxyun.com.key'),
  cert: fs.readFileSync('ssl/xxxxyun.com.pem'),
}

var httpsserver = https.createServer(options, app.callback())
httpsserver.listen(port, (err) => {
  if (err) {
    console.log('server init error', err);
  } else {
    console.log('server running at port :' + port);
  }
});
httpsserver.on('error', onError);
httpsserver.on('listening', onListening);


/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTPs server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTPs server "listening" event.
 */

function onListening() {
  var addr = httpsserver.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值