@aniyajs/rotor
Version:
基于webpack5开发的一款专注于打包、运行的工具
90 lines (82 loc) • 3.37 kB
JavaScript
const fs = require("fs");
const path = require("path");
const crypto = require("crypto");
const chalk = require("chalk");
const paths = require("./paths");
const clientEnv = require("../webpack/env")();
/**
* 验证给定的证书和密钥是否有效。
* @param {Object} 参数对象,包含以下属性:
* - cert: string,公钥证书。
* - key: string,私钥。
* - keyFile: string,私钥文件路径。
* - crtFile: string,公钥证书文件路径。
* 此函数不返回任何内容,如果证书或密钥无效,将抛出易于调试的错误。
*/
function validateKeyAndCerts({ cert, key, keyFile, crtFile }) {
let encrypted;
try {
// 尝试使用公钥加密测试字符串,以验证证书的有效性。
encrypted = crypto.publicEncrypt(cert, Buffer.from("test"));
} catch (err) {
throw new Error(`证书 "${chalk.yellow(crtFile)}" 无效。\n${err.message}`);
}
try {
// 尝试使用私钥解密加密的测试字符串,以验证密钥的有效性。
crypto.privateDecrypt(key, encrypted);
} catch (err) {
throw new Error(
`证书密钥 "${chalk.yellow(keyFile)}" 无效。\n${err.message}`,
);
}
}
/**
* 读取指定的环境文件,并在文件不存在时抛出错误。
*
* @param {string} file - 需要读取的文件路径。
* @param {string} type - 在环境中指定的文件类型,用于错误信息的展示。
* @returns {Buffer} 返回文件内容的Buffer对象。
* @throws {Error} 如果文件不存在,则抛出包含详细错误信息的异常。
*/
function readEnvFile(file, type) {
// 检查文件是否存在,不存在则抛出错误
if (!fs.existsSync(file)) {
throw new Error(
`你在环境文件中指定了${chalk.cyan(
type,
)},但是文件"${chalk.yellow(file)}"不存在。`,
);
}
// 读取并返回文件内容
return fs.readFileSync(file);
}
/**
* 获取HTTPS配置信息。
* 如果环境变量中提供了HTTPS、SSL_CRT_FILE和SSL_KEY_FILE,则返回包含证书文件路径的配置对象。
* 否则,仅返回HTTPS配置的布尔值。
*
* @returns {Object|boolean} 如果提供了HTTPS相关的环境变量且证书文件有效,则返回包含证书和密钥路径的配置对象;否则,返回HTTPS配置的布尔值。
*/
function getHttpsConfig() {
// 从环境变量中获取HTTPS配置
const HTTPS = clientEnv.raw?.devServer?.https;
const SSL_CRT_FILE = clientEnv.raw?.devServer?.ssl_crt_file;
const SSL_KEY_FILE = clientEnv.raw?.devServer?.ssl_key_file;
// 如果HTTPS及证书文件路径都提供,则配置HTTPS
if (HTTPS && SSL_CRT_FILE && SSL_KEY_FILE) {
// 解析证书和密钥的文件路径
const crtFile = path.resolve(paths.appPath, SSL_CRT_FILE);
const keyFile = path.resolve(paths.appPath, SSL_KEY_FILE);
// 读取并配置证书文件和密钥文件
const config = {
cert: readEnvFile(crtFile, "SSL_CRT_FILE"),
key: readEnvFile(keyFile, "SSL_KEY_FILE"),
};
// 验证证书和密钥的有效性
validateKeyAndCerts({ ...config, keyFile, crtFile });
return config;
}
// 如果没有提供证书文件路径,仅返回HTTPS配置的布尔值
return HTTPS;
}
module.exports = getHttpsConfig;