register multiple challenges

This commit is contained in:
AJ ONeal 2016-08-15 15:33:26 -06:00
parent bb211e8f42
commit 9517980889
2 changed files with 54 additions and 12 deletions

View File

@ -122,7 +122,8 @@ function leAgree(opts, agreeCb) {
le = LE.create({ le = LE.create({
server: LE.stagingServerUrl // or LE.productionServerUrl server: LE.stagingServerUrl // or LE.productionServerUrl
, store: leStore // handles saving of config, accounts, and certificates , store: leStore // handles saving of config, accounts, and certificates
, challenge: leChallenge // handles /.well-known/acme-challege keys and tokens , challenges: { 'http-01': leChallenge } // handles /.well-known/acme-challege keys and tokens
, challengeType: 'http-01' // default to this challenge type
, agreeToTerms: leAgree // hook to allow user to view and accept LE TOS , agreeToTerms: leAgree // hook to allow user to view and accept LE TOS
, debug: false , debug: false
}); });
@ -132,7 +133,7 @@ le = LE.create({
// app.use('/', le.middleware()); // app.use('/', le.middleware());
// //
// Otherwise you should see the test file for usage of this: // Otherwise you should see the test file for usage of this:
// le.challenge.get(opts.domain, key, val, done) // le.challenges['http-01'].get(opts.domain, key, val, done)
@ -160,7 +161,7 @@ le.check({ domains: [ 'example.com' ] }).then(function (results) {
}, function (err) { }, function (err) {
// Note: you must either use le.middleware() with express, // Note: you must either use le.middleware() with express,
// manually use le.challenge.get(opts, domain, key, val, done) // manually use le.challenges['http-01'].get(opts, domain, key, val, done)
// or have a webserver running and responding // or have a webserver running and responding
// to /.well-known/acme-challenge at `webrootPath` // to /.well-known/acme-challenge at `webrootPath`
console.error('[Error]: node-letsencrypt/examples/standalone'); console.error('[Error]: node-letsencrypt/examples/standalone');

View File

@ -13,6 +13,7 @@ LE.defaults = {
, rsaKeySize: ACME.rsaKeySize || 2048 , rsaKeySize: ACME.rsaKeySize || 2048
, challengeType: ACME.challengeType || 'http-01' , challengeType: ACME.challengeType || 'http-01'
, challengeTypes: ACME.challengeTypes || [ 'http-01', 'tls-sni-01', 'dns-01' ]
, acmeChallengePrefix: ACME.acmeChallengePrefix , acmeChallengePrefix: ACME.acmeChallengePrefix
}; };
@ -28,6 +29,9 @@ LE._undefined = {
acme: u acme: u
, store: u , store: u
, challenge: u , challenge: u
, challenges: u
, sni: u
, httpsOptions: u
, register: u , register: u
, check: u , check: u
@ -57,9 +61,29 @@ LE.create = function (le) {
le.acme = le.acme || ACME.create({ debug: le.debug }); le.acme = le.acme || ACME.create({ debug: le.debug });
le.store = le.store || require('le-store-certbot').create({ debug: le.debug }); le.store = le.store || require('le-store-certbot').create({ debug: le.debug });
le.challenge = le.challenge || require('le-challenge-fs').create({ debug: le.debug });
le.core = require('./lib/core'); le.core = require('./lib/core');
if (!le.challenges) {
le.challenges = {};
}
if (!le.challenges['http-01']) {
le.challenges['http-01'] = require('le-challenge-fs').create({ debug: le.debug });
}
if (!le.challenges['tls-sni-01']) {
le.challenges['tls-sni-01'] = le.challenges['http-01'];
}
if (!le.challenges['dns-01']) {
try {
le.challenges['dns-01'] = require('le-challenge-ddns').create({ debug: le.debug });
} catch(e) {
try {
le.challenges['dns-01'] = require('le-challenge-dns').create({ debug: le.debug });
} catch(e) {
// not yet implemented
}
}
}
le = LE._undefine(le); le = LE._undefine(le);
le.acmeChallengePrefix = LE.acmeChallengePrefix; le.acmeChallengePrefix = LE.acmeChallengePrefix;
le.rsaKeySize = le.rsaKeySize || LE.rsaKeySize; le.rsaKeySize = le.rsaKeySize || LE.rsaKeySize;
@ -106,16 +130,33 @@ LE.create = function (le) {
} }
}); });
if (le.challenge.create) { LE.challengeTypes.forEach(function (challengeType) {
le.challenge = le.challenge.create(le); if (le.challenges[challengeType].create) {
le.challenges[challengeType] = le.challenges[challengeType].create(le);
} }
le.challenge = PromiseA.promisifyAll(le.challenge); le.challenges[challengeType] = PromiseA.promisifyAll(le.challenges[challengeType]);
le._challengeOpts = le.challenge.getOptions(); le['_challengeOpts_' + challengeType] = le.challenges[challengeType].getOptions();
Object.keys(le._challengeOpts).forEach(function (key) { Object.keys(le._challengeOpts).forEach(function (key) {
if (!(key in le)) { if (!(key in le)) {
le[key] = le._challengeOpts[key]; le[key] = le._challengeOpts[key];
} }
}); });
});
//
// Backwards compat until we fix le.challenges to be per-request
//
if (le.challenge) {
console.warn("Deprecated use of le.challenge. Use le.challenges['" + LE.challengeType + "'] instead.");
// TODO le.challenges[le.challengeType] = le.challenge
if (le.challenge.create) {
le.challenge = le.challenge.create(le);
}
}
else {
le.challenge = le.challenge[le.challengeType];
}
le._challengeOpts = le.challenge.getOptions();
le.sni = le.sni || null; le.sni = le.sni || null;
if (!le.httpsOptions) { if (!le.httpsOptions) {