forked from root/acme.js
102 lines
2.2 KiB
JavaScript
102 lines
2.2 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var ACME = require('../');
|
||
|
var Keypairs = require('../lib/keypairs.js');
|
||
|
var acme = ACME.create({});
|
||
|
|
||
|
var config = {
|
||
|
env: process.env.ENV,
|
||
|
email: process.env.SUBSCRIBER_EMAIL,
|
||
|
domain: process.env.BASE_DOMAIN
|
||
|
};
|
||
|
config.debug = !/^PROD/i.test(config.env);
|
||
|
|
||
|
async function happyPath() {
|
||
|
var domains = randomDomains();
|
||
|
var agreed = false;
|
||
|
var metadata = await acme.init(
|
||
|
'https://acme-staging-v02.api.letsencrypt.org/directory'
|
||
|
);
|
||
|
|
||
|
// Ready to use, show page
|
||
|
if (config.debug) {
|
||
|
console.info('ACME.js initialized');
|
||
|
console.info(metadata);
|
||
|
console.info('');
|
||
|
console.info();
|
||
|
}
|
||
|
|
||
|
// EC for account (but RSA for cert, for testing both)
|
||
|
var accountKeypair = await Keypairs.generate({ kty: 'EC' });
|
||
|
if (config.debug) {
|
||
|
console.info('Account Key Created');
|
||
|
console.info(JSON.stringify(accountKeypair, null, 2));
|
||
|
console.info('');
|
||
|
console.info();
|
||
|
}
|
||
|
|
||
|
var account = await acme.accounts.create({
|
||
|
agreeToTerms: agree,
|
||
|
// TODO detect jwk/pem/der?
|
||
|
accountKeypair: { privateKeyJwk: accountKeypair.private },
|
||
|
email: config.email
|
||
|
});
|
||
|
// TODO top-level agree
|
||
|
function agree(tos) {
|
||
|
if (config.debug) {
|
||
|
console.info('Agreeing to Terms of Service:');
|
||
|
console.info(tos);
|
||
|
console.info('');
|
||
|
console.info();
|
||
|
}
|
||
|
agreed = true;
|
||
|
return Promise.resolve(tos);
|
||
|
}
|
||
|
if (config.debug) {
|
||
|
console.info('New Subscriber Account');
|
||
|
console.info(JSON.stringify(account, null, 2));
|
||
|
console.info();
|
||
|
console.info();
|
||
|
}
|
||
|
if (!agreed) {
|
||
|
throw new Error('Failed to ask the user to agree to terms');
|
||
|
}
|
||
|
|
||
|
var serverKeypair = await Keypairs.generate({ kty: 'RSA' });
|
||
|
if (config.debug) {
|
||
|
console.info('Server Key Created');
|
||
|
console.info(JSON.stringify(serverKeypair, null, 2));
|
||
|
console.info('');
|
||
|
console.info();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
happyPath()
|
||
|
.then(function() {
|
||
|
console.info('success');
|
||
|
})
|
||
|
.catch(function(err) {
|
||
|
console.error('Error:');
|
||
|
console.error(err.stack);
|
||
|
});
|
||
|
|
||
|
function randomDomains() {
|
||
|
var rnd = random();
|
||
|
return ['foo-acmejs', 'bar-acmejs', '*.baz-acmejs', 'baz-acmejs'].map(
|
||
|
function(pre) {
|
||
|
return pre + '-' + rnd + '.' + config.domain;
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
|
||
|
function random() {
|
||
|
return parseInt(
|
||
|
Math.random()
|
||
|
.toString()
|
||
|
.slice(2, 99),
|
||
|
10
|
||
|
)
|
||
|
.toString(16)
|
||
|
.slice(0, 4);
|
||
|
}
|