UNPKG

catproxy

Version:

a node proxy or host change tools

115 lines (108 loc) 3.38 kB
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 };