None of the node libraries seem to support the options I need, so I use the openssl executable.
import { execSync } from 'child_process' import fs from 'fs' import tempy from 'tempy' const extHeader = `authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] ` const shell = cmd => execSync(cmd, { stdio: 'pipe' }) const writeCert = (extFile, outfile) => { const cmd = [ `openssl`, `x509`, `-req`, `-in ssl/my.csr`, `-CA ssl/root-ca.pem`, `-CAkey ssl/root-ca.key`, `-CAserial ssl/root-ca.srl`, `-out ssl/${outfile}`, `-days 1825`, `-sha256`, `-extfile ${extFile}`, `-passin pass:mypassphrase` ] shell(cmd.join(' ')) } const createCert = domains => { const sans = domains.map((d, i) => `DNS.${i + 1} = ${d}`) const ext = extHeader + sans.join('\n') const extFile = tempy.file() fs.writeFileSync(extFile, ext, 'utf-8') writeCert(extFile, 'out.crt') }
Dependencies:
- openssl executable
- yarn add tempy