Add SSL to Node.js Koa Server?
Asked Answered
I

2

14

I'd like to encrypt my Koa server with SSL. It seems simple enough with a regular httpServer, but I'm not how to do it with Koa. Could anyone help?

Imagery answered 22/6, 2017 at 3:16 Comment(3)
@Rob Koa is a web framework (like express) rather than a web server (like Nginx or Apache). No documentation exists on configuring it directly with HTTPS (rather than running a server on top). Please at least try to read my question before making such a vicious, unproductive comment.Imagery
Then I confused it with a server I once knew however the rest of my comment still standsAsteroid
Not really. It doesn't even look like there's a way to set up SSL on Koa.js. I checked through the documentation like three times over and there's literally no way to do it. I ended up actually going into Koa's source code and modifying that. So no, your comment doesn't really stand. Please try to refrain from making those sorts of comments on subjects you know absolutely nothing about.Imagery
T
21

I stumbled upon this. Launching an https server with the node package and passing it the Koa server instance .callback() does the trick.

Koa's doc

var fs = require('fs');
var path = require('path');
var http = require('http');
var https = require('https');

var Koa = require('koa');
var server = new Koa();

// add main routes

// the following routes are for the authorisation challenges
// ... we'll come back to this shortly
var acmeRouter = require('./acme-router.js');
server
  .use(acmeRouter.routes())
  .use(acmeRouter.allowedMethods());

var config = {
  domain: 'example.com',
  http: {
    port: 8989,
  },
  https: {
    port: 7979,
    options: {
      key: fs.readFileSync(path.resolve(process.cwd(), 'certs/privkey.pem'), 'utf8').toString(),
      cert: fs.readFileSync(path.resolve(process.cwd(), 'certs/fullchain.pem'), 'utf8').toString(),
    },
  },
};

let serverCallback = server.callback();
try {
  var httpServer = http.createServer(serverCallback);
  httpServer
    .listen(config.http.port, function(err) {
      if (!!err) {
        console.error('HTTP server FAIL: ', err, (err && err.stack));
      }
      else {
        console.log(`HTTP  server OK: http://${config.domain}:${config.http.port}`);
      }
    });
}
catch (ex) {
  console.error('Failed to start HTTP server\n', ex, (ex && ex.stack));
}
try {
  var httpsServer = https.createServer(config.https.options, serverCallback);
  httpsServer
    .listen(config.https.port, function(err) {
      if (!!err) {
        console.error('HTTPS server FAIL: ', err, (err && err.stack));
      }
      else {
        console.log(`HTTPS server OK: http://${config.domain}:${config.https.port}`);
      }
    });
}
catch (ex) {
  console.error('Failed to start HTTPS server\n', ex, (ex && ex.stack));
}

module.exports = server;
Thickwitted answered 19/7, 2017 at 16:14 Comment(1)
Thanks a bunch for taking the time to answer this even though I solved my own issue! I'll definitely use this trick in the future!Imagery
I
2

Looks like there's no clear cut way to do this, but running Nginx on top of my server was an easy workaround.

Imagery answered 30/6, 2017 at 21:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.