UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

115 lines (114 loc) 3.44 kB
import { w as pathExists } from "./fs-safe-aqmM_n6V.js"; import { h as shortenHomeInString, p as resolveUserPath, s as ensureDir, t as CONFIG_DIR } from "./utils-CCC-BEJH.js"; import { t as resolveSystemBin } from "./resolve-system-bin-CJQrVEby.js"; import { t as normalizeFingerprint } from "./fingerprint-D5SzDQZa.js"; import path from "node:path"; import fs from "node:fs/promises"; import { execFile } from "node:child_process"; import { X509Certificate } from "node:crypto"; import { promisify } from "node:util"; import "node:tls"; //#region src/infra/tls/gateway.ts const execFileAsync = promisify(execFile); async function generateSelfSignedCert(params) { const certDir = path.dirname(params.certPath); const keyDir = path.dirname(params.keyPath); await ensureDir(certDir); if (keyDir !== certDir) await ensureDir(keyDir); const opensslBin = resolveSystemBin("openssl"); if (!opensslBin) throw new Error("openssl not found in trusted system directories. Install it in an OS-managed location."); await execFileAsync(opensslBin, [ "req", "-x509", "-newkey", "rsa:2048", "-sha256", "-days", "3650", "-nodes", "-keyout", params.keyPath, "-out", params.certPath, "-subj", "/CN=openclaw-gateway" ]); await fs.chmod(params.keyPath, 384).catch(() => {}); await fs.chmod(params.certPath, 384).catch(() => {}); params.log?.info?.(`gateway tls: generated self-signed cert at ${shortenHomeInString(params.certPath)}`); } /** Load or generate gateway TLS material and return server-ready TLS options. */ async function loadGatewayTlsRuntime(cfg, log) { if (!cfg || cfg.enabled !== true) return { enabled: false, required: false }; const autoGenerate = cfg.autoGenerate !== false; const baseDir = path.join(CONFIG_DIR, "gateway", "tls"); const certPath = resolveUserPath(cfg.certPath ?? path.join(baseDir, "gateway-cert.pem")); const keyPath = resolveUserPath(cfg.keyPath ?? path.join(baseDir, "gateway-key.pem")); const caPath = cfg.caPath ? resolveUserPath(cfg.caPath) : void 0; const hasCert = await pathExists(certPath); const hasKey = await pathExists(keyPath); if (!hasCert && !hasKey && autoGenerate) try { await generateSelfSignedCert({ certPath, keyPath, log }); } catch (err) { return { enabled: false, required: true, certPath, keyPath, error: `gateway tls: failed to generate cert (${String(err)})` }; } if (!await pathExists(certPath) || !await pathExists(keyPath)) return { enabled: false, required: true, certPath, keyPath, error: "gateway tls: cert/key missing" }; try { const cert = await fs.readFile(certPath, "utf8"); const key = await fs.readFile(keyPath, "utf8"); const ca = caPath ? await fs.readFile(caPath, "utf8") : void 0; const fingerprintSha256 = normalizeFingerprint(new X509Certificate(cert).fingerprint256 ?? ""); if (!fingerprintSha256) return { enabled: false, required: true, certPath, keyPath, caPath, error: "gateway tls: unable to compute certificate fingerprint" }; return { enabled: true, required: true, certPath, keyPath, caPath, fingerprintSha256, tlsOptions: { cert, key, ca, minVersion: "TLSv1.3" } }; } catch (err) { return { enabled: false, required: true, certPath, keyPath, caPath, error: `gateway tls: failed to load cert (${String(err)})` }; } } //#endregion export { loadGatewayTlsRuntime as t };