64 lines
2.0 KiB
JavaScript
Executable File
64 lines
2.0 KiB
JavaScript
Executable File
// Generiert selbstsignierte Zertifikate bei npm install
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
import selfsigned from 'selfsigned';
|
|
|
|
const CERT_DIR = path.resolve('certs');
|
|
const KEY_PATH = path.join(CERT_DIR, 'localhost.key');
|
|
const CRT_PATH = path.join(CERT_DIR, 'localhost.crt');
|
|
|
|
function ensureDir(p) {
|
|
if (!fs.existsSync(p)) fs.mkdirSync(p, { recursive: true });
|
|
}
|
|
|
|
function generateIfMissing() {
|
|
ensureDir(CERT_DIR);
|
|
const host = process.env.HTTPS_HOST || 'localhost';
|
|
const days = parseInt(process.env.HTTPS_CERT_DAYS || '3650', 10);
|
|
|
|
const needKey = !fs.existsSync(KEY_PATH);
|
|
const needCrt = !fs.existsSync(CRT_PATH);
|
|
|
|
if (!needKey && !needCrt) {
|
|
console.log(`[certs] Zertifikate existieren bereits in ${CERT_DIR}`);
|
|
return;
|
|
}
|
|
|
|
console.log(`[certs] Erzeuge selbstsigniertes Zertifikat für CN=${host}, ${days} Tage gültig...`);
|
|
const attrs = [{ name: 'commonName', value: host }];
|
|
const pems = selfsigned.generate(attrs, {
|
|
keySize: 2048,
|
|
days,
|
|
algorithm: 'sha256',
|
|
extensions: [
|
|
{ name: 'basicConstraints', cA: true },
|
|
{ name: 'keyUsage', keyCertSign: true, digitalSignature: true, nonRepudiation: true, keyEncipherment: true },
|
|
{ name: 'extKeyUsage', serverAuth: true, clientAuth: true },
|
|
{ name: 'subjectAltName', altNames: [ { type: 2, value: host }, { type: 7, ip: '127.0.0.1' } ] }
|
|
]
|
|
});
|
|
|
|
fs.writeFileSync(KEY_PATH, pems.private, { mode: 0o600 });
|
|
fs.writeFileSync(CRT_PATH, pems.cert, { mode: 0o644 });
|
|
|
|
const readme = `Diese Zertifikate sind nur für lokale Entwicklung gedacht.
|
|
|
|
` +
|
|
`Dateien:
|
|
- ${KEY_PATH}
|
|
- ${CRT_PATH}
|
|
|
|
` +
|
|
`Nicht committen! Siehe .gitignore.`;
|
|
fs.writeFileSync(path.join(CERT_DIR, 'README.txt'), readme);
|
|
|
|
console.log(`[certs] Zertifikate erzeugt unter ${CERT_DIR}`);
|
|
}
|
|
|
|
try {
|
|
generateIfMissing();
|
|
} catch (err) {
|
|
console.error('[certs] Fehler beim Erzeugen der Zertifikate:', err?.message || err);
|
|
process.exit(0); // nicht als harter Fehler werten
|
|
}
|