Search code examples
node.jshttpskoa

Add SSL to Node.js Koa Server?


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?


Solution

  • 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;