catproxy
Version:
a node proxy or host change tools
123 lines (115 loc) • 3.37 kB
JavaScript
import fs from 'fs';
import path from 'path';
import fse from 'fs-extra';
import {md} from 'node-forge';
import log from '../log';
import {createRootCert, createSelfCert} from './createCert';
var certDir = process.env.APPDATA;
var heartReg = /\*/g;
if (!certDir || certDir === 'undefined') {
certDir = (process.platform === 'darwin' ? path.join(process.env.HOME, 'Library/Preferences') : '/var/local');
}
certDir = path.join(certDir, './.cert_center');
var rootKeyPath = path.resolve(certDir, './cert.key');
var rootCrtPath = path.resolve(certDir, './cert.crt');
var rootPfxPath = path.resolve(certDir, './cert.pfx');
var certCachePath = path.resolve(certDir, 'certCache');
var certCache = {};
// console.log(log);
// 是否纯在根证书
var isRootCertExits = () => {
return !!(fs.existsSync(certDir) && fs.existsSync(rootKeyPath) && fs.existsSync(rootCrtPath));
};
var setRootCert = () => {
fse.ensureDirSync(certDir);
// 清除已经有的证书
fse.emptyDirSync(certDir);
log.info('根证书生成目录: ' + certDir);
var result = createRootCert();
let privateKey = result.privateKey;
let cert = result.cert;
fs.writeFileSync(rootKeyPath, privateKey);
fs.writeFileSync(rootCrtPath, cert);
fs.writeFileSync(rootPfxPath, result.pfx);
return {
privateKey,
cert
};
};
// 不存在根证书就创建
var getRootCert = () => {
var privateKey, cert;
// 存在缓存,直接调用
if (certCache.root) {
return certCache.root;
}
// 确保证书目录存在
fse.ensureDirSync(certDir);
if (!isRootCertExits()) {
return setRootCert();
} else {
privateKey = fs.readFileSync(rootKeyPath, {encoding: 'utf8'});
cert = fs.readFileSync(rootCrtPath, {encoding: 'utf8'});
certCache.root = {privateKey, cert};
}
return {privateKey, cert};
};
// 证书是否存在
var isCertExits = (keyPath, crtPath) => {
return fs.existsSync(keyPath) && fs.existsSync(crtPath);
};
// 获取证书
var getCert = (domain) => {
var result = {};
if (!domain) {
return result;
}
// 已经存在,则从缓存中获取
if (certCache[domain]) {
return certCache[domain];
}
// var mc = md.md5.create();
// mc.update(domain);
// var domainMd5 = mc.digest().toHex();
var domainC = domain.replace(heartReg, "_");
var keyPath = path.join(certCachePath, domainC + ".key");
var certPath = path.join(certCachePath, domainC + ".crt");
var cert, privateKey;
if (isCertExits(keyPath, certPath)) {
privateKey = fs.readFileSync(keyPath, {encoding: 'utf8'});
cert = fs.readFileSync(certPath, {encoding: 'utf8'});
} else {
({cert, privateKey} = createSelfCert(domain, getRootCert()));
fse.ensureDirSync(certCachePath);
fs.writeFileSync(keyPath, privateKey);
fs.writeFileSync(certPath, cert);
}
certCache[domain] = {cert, privateKey};
return {cert, privateKey};
};
// 删除证书目录
var emptyCertDir = () => {
fse.emptyDirSync(certDir);
};
var setCertDir = (path) => {
if (!path) {return;}
fse.ensureDirSync(path);
certDir = path;
rootKeyPath = path.resolve(certDir, './cert.key');
rootCrtPath = path.resolve(certDir, './cert.crt');
certCachePath = path.resolve(certDir, 'certCache');
};
var getCertDir = () => certDir;
var getRootCertPath = () => rootCrtPath;
// getCert('lmlc.com');
// emptyCertDir();
export {
isRootCertExits,
setRootCert,
setCertDir,
getCertDir,
getRootCertPath,
emptyCertDir,
getCert,
getRootCert
};