UNPKG

@aniyajs/rotor

Version:

基于webpack5开发的一款专注于打包、运行的工具

90 lines (82 loc) 3.37 kB
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;