mirror of https://github.com/certd/certd
93 lines
2.6 KiB
JavaScript
93 lines
2.6 KiB
JavaScript
/**
|
|
* Example using dns-01 challenge to generate certificates
|
|
*
|
|
* NOTE: This example is incomplete as the DNS challenge response implementation
|
|
* will be specific to your DNS providers API.
|
|
*
|
|
* NOTE: This example does not order certificates on-demand, as solving dns-01
|
|
* will likely be too slow for it to make sense. Instead, it orders a wildcard
|
|
* certificate on init before starting the HTTPS server as a demonstration.
|
|
*/
|
|
|
|
const https = require('https');
|
|
const acme = require('./../../');
|
|
|
|
const HTTPS_SERVER_PORT = 443;
|
|
const WILDCARD_DOMAIN = 'example.com';
|
|
|
|
function log(m) {
|
|
process.stdout.write(`${(new Date()).toISOString()} ${m}\n`);
|
|
}
|
|
|
|
|
|
/**
|
|
* Main
|
|
*/
|
|
|
|
(async () => {
|
|
try {
|
|
/**
|
|
* Initialize ACME client
|
|
*/
|
|
|
|
log('Initializing ACME client');
|
|
const client = new acme.Client({
|
|
directoryUrl: acme.directory.letsencrypt.staging,
|
|
accountKey: await acme.crypto.createPrivateKey()
|
|
});
|
|
|
|
|
|
/**
|
|
* Order wildcard certificate
|
|
*/
|
|
|
|
log(`Creating CSR for ${WILDCARD_DOMAIN}`);
|
|
const [key, csr] = await acme.crypto.createCsr({
|
|
commonName: WILDCARD_DOMAIN,
|
|
altNames: [`*.${WILDCARD_DOMAIN}`]
|
|
});
|
|
|
|
log(`Ordering certificate for ${WILDCARD_DOMAIN}`);
|
|
const cert = await client.auto({
|
|
csr,
|
|
email: 'test@example.com',
|
|
termsOfServiceAgreed: true,
|
|
challengePriority: ['dns-01'],
|
|
challengeCreateFn: (authz, challenge, keyAuthorization) => {
|
|
/* TODO: Implement this */
|
|
log(`[TODO] Add TXT record key=_acme-challenge.${authz.identifier.value} value=${keyAuthorization}`);
|
|
},
|
|
challengeRemoveFn: (authz, challenge, keyAuthorization) => {
|
|
/* TODO: Implement this */
|
|
log(`[TODO] Remove TXT record key=_acme-challenge.${authz.identifier.value} value=${keyAuthorization}`);
|
|
}
|
|
});
|
|
|
|
log(`Certificate for ${WILDCARD_DOMAIN} created successfully`);
|
|
|
|
|
|
/**
|
|
* HTTPS server
|
|
*/
|
|
|
|
const requestListener = (req, res) => {
|
|
log(`HTTP 200 ${req.headers.host}${req.url}`);
|
|
res.writeHead(200);
|
|
res.end('Hello world\n');
|
|
};
|
|
|
|
const httpsServer = https.createServer({
|
|
key,
|
|
cert
|
|
}, requestListener);
|
|
|
|
httpsServer.listen(HTTPS_SERVER_PORT, () => {
|
|
log(`HTTPS server listening on port ${HTTPS_SERVER_PORT}`);
|
|
});
|
|
}
|
|
catch (e) {
|
|
log(`[FATAL] ${e.message}`);
|
|
process.exit(1);
|
|
}
|
|
})();
|