catproxy
Version:
a node proxy or host change tools
115 lines (108 loc) • 3.38 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 };