From 071a2e6dbe2c1e91f7e46a2fdeb3f7b0befbfc50 Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Sun, 14 Jan 2018 21:39:45 +0100 Subject: [PATCH] Added function to generate SSL certificate (unused, as of yet) --- lib/generateSSLcert.js | 46 +++++++++++++++++++++++++++++++++++++ lib/generateSSLcert.spec.js | 25 ++++++++++++++++++++ package.json | 1 + 3 files changed, 72 insertions(+) create mode 100644 lib/generateSSLcert.js create mode 100644 lib/generateSSLcert.spec.js diff --git a/lib/generateSSLcert.js b/lib/generateSSLcert.js new file mode 100644 index 00000000..fd65e9db --- /dev/null +++ b/lib/generateSSLcert.js @@ -0,0 +1,46 @@ +var forge = require("node-forge"); +forge.options.usePureJavaScript = true; +var fs = require("fs"); +var mkdirp = require("mkdirp"); + +var pki = forge.pki; +var rsa = forge.pki.rsa; +var startTime, endTime; + +var doLogging = true; +if(!doLogging) console.log = function(){}; + +module.exports = function({ + bits = 2048, + certificatePath = "database/certificate", +} = {}){ + console.log("Generating SSL certificate with "+bits+" bits at "+certificatePath); + + startTime = Date.now(); + var keypair = rsa.generateKeyPair({bits: bits, e: 0x10001}); + endTime = Date.now(); + console.log("Generated 2048bit keypair in: "+(endTime-startTime)+" ms"); + + startTime = Date.now(); + var cert = pki.createCertificate(); + cert.publicKey = keypair.publicKey; + cert.serialNumber = "01"; + + cert.validity.notBefore = new Date(); + cert.validity.notAfter = new Date(Date.now()+(1000*60*60*24*365)); // valid for one year + + // self-sign certificate + cert.sign(keypair.privateKey); + + // Convert certificate to pem type and write it to a file + if(certificatePath[certificatePath.length-1] != "/") certificatePath += "/"; + if(!fs.existsSync(certificatePath)) { + mkdirp.sync(certificatePath); + console.log("Created directory: "+certificatePath); + } + fs.writeFileSync(certificatePath+ "cert.key", keypair.privateKey); + fs.writeFileSync(certificatePath+ "cert.crt", pki.certificateToPem(cert)); + + endTime = Date.now(); + console.log("Generated certificate in: "+(endTime-startTime)+" ms"); +} diff --git a/lib/generateSSLcert.spec.js b/lib/generateSSLcert.spec.js new file mode 100644 index 00000000..2b356621 --- /dev/null +++ b/lib/generateSSLcert.spec.js @@ -0,0 +1,25 @@ +var assert = require("assert"); +var fs = require("fs"); + +var fileOps = require("./fileOps.js"); +var generateSSLcert = require("./generateSSLcert.js") + +describe("generateSSLcert.js(options)", ()=>{ + it("Creates a folder with a .crt and .key file in it", ()=>{ + let certPath = "lib/certTestPlsDelete"; + + assert(!fs.existsSync(certPath)); // if it already exsits, the test might pass because of leftover data (which is bad) + + generateSSLcert({ + // bits:512, // supported, but I just use the default of 2048 for this test + certificatePath:certPath, + }); + + assert(fs.existsSync(certPath)); + assert(fs.existsSync(certPath+"/cert.key")); // private key + assert(fs.existsSync(certPath+"/cert.crt")); // certificate file + + // remove certificates and data from the test + fileOps.deleteFolderRecursiveSync(certPath); + }).timeout(10000); +}); \ No newline at end of file diff --git a/package.json b/package.json index 19273a35..5a0f0099 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "nedb": "^1.8.0", "needle": "^1.1.0", "node-factorio-api": "^0.1.28", + "node-forge": "^0.7.1", "request": "^2.83.0", "right-pad": "^1.0.1", "rmdir-sync": "^1.0.1",