UNPKG

devcert

Version:

Generate trusted local SSL/TLS certificates for local SSL development

47 lines (40 loc) 2.18 kB
// import path from 'path'; import createDebug from 'debug'; import { sync as mkdirp } from 'mkdirp'; import { chmodSync as chmod } from 'fs'; import { openssl } from './utils'; import { withCertificateAuthorityCredentials } from './certificate-authority'; import {pathForDomain, getStableDomainPath, withDomainSigningRequestConfig, withDomainCertificateConfig} from './constants'; const debug = createDebug('devcert:certificates'); /** * Generate a domain certificate signed by the devcert root CA. Domain * certificates are cached in their own directories under * CONFIG_ROOT/domains/<domain>, and reused on subsequent requests. Because the * individual domain certificates are signed by the devcert root CA (which was * added to the OS/browser trust stores), they are trusted. */ export default async function generateDomainCertificate(domains: string[]): Promise<void> { const domainPath = getStableDomainPath(domains); mkdirp(pathForDomain(domainPath)); debug(`Generating private key for ${domains}`); let domainKeyPath = pathForDomain(domainPath, 'private-key.key'); generateKey(domainKeyPath); debug(`Generating certificate signing request for ${domains}`); let csrFile = pathForDomain(domainPath, `certificate-signing-request.csr`); withDomainSigningRequestConfig(domains, (configpath) => { openssl(['req', '-new', '-config', configpath, '-key', domainKeyPath, '-out', csrFile]); }); debug(`Generating certificate for ${domains} from signing request and signing with root CA`); let domainCertPath = pathForDomain(domainPath, `certificate.crt`); await withCertificateAuthorityCredentials(({caKeyPath, caCertPath}) => { withDomainCertificateConfig(domains, (domainCertConfigPath) => { openssl(['ca', '-config', domainCertConfigPath, '-in', csrFile, '-out', domainCertPath, '-keyfile', caKeyPath, '-cert', caCertPath, '-days', '825', '-batch']) }); }); } // Generate a cryptographic key, used to sign certificates or certificate signing requests. export function generateKey(filename: string): void { debug(`generateKey: ${ filename }`); openssl(['genrsa', '-out', filename, '2048']); chmod(filename, 400); }