magent
Version:
A local MITM HTTP(s) request message proxy server
39 lines (38 loc) • 1.45 kB
JavaScript
const forge = require('node-forge');
const fs = require('fs');
const pki = forge.pki;
const certMaps = [];
let caKey, caCert;
const create = async(a)=>{
const time = Date.now()
const kpair = pki.rsa.generateKeyPair(2046);
const cert = pki.createCertificate();
Object.assign(cert, {publicKey:kpair.publicKey, serialNumber:time+''});
Object.assign(cert.validity, {notBefore:new Date(time-864e5), notAfter:new Date(time+a)});
return {key:kpair.privateKey, cert}
}
const gen = async(issuer='magent')=>{
let i=0, ret=[];
while(i++<2) await create(864e8).then(({key,cert})=>{
cert.setSubject([{shortName:'CN', value:issuer}]);
cert.setIssuer([{shortName:'CN', value:issuer}]);
cert.setExtensions([{name:'basicConstraints', critical:true, cA:true}]);
cert.sign(key, forge.md.sha256.create());
ret.push({key:pki.privateKeyToPem(key), cert:pki.certificateToPem(cert)});
});
return ret;
}
const cert = async(host)=>{
return certMaps[host]||create(864e6).then(({key,cert})=>{
cert.setSubject([{shortName:'CN', value:host}]);
cert.setIssuer(caCert.subject.attributes);
cert.setExtensions([{name:'subjectAltName', altNames:[{type:2, value:host}]}]);
cert.sign(caKey, forge.md.sha256.create());
return certMaps[host]={key:pki.privateKeyToPem(key), cert:pki.certificateToPem(cert)};
});
}
const load = ({key,cert})=>{
caKey = pki.privateKeyFromPem(key);
caCert = pki.certificateFromPem(cert);
}
module.exports = { gen, cert, load };