103 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			103 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								// This Source Code Form is subject to the terms of the Mozilla Public
							 | 
						||
| 
								 | 
							
								// License, v. 2.0. If a copy of the MPL was not distributed with this
							 | 
						||
| 
								 | 
							
								// file, You can obtain one at http://mozilla.org/MPL/2.0/.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var le;
							 | 
						||
| 
								 | 
							
								var fetch = require('node-fetch');
							 | 
						||
| 
								 | 
							
								var LE = require('greenlock');
							 | 
						||
| 
								 | 
							
								var leChallengeDns = require('./index.js').create({ debug: false })
							 | 
						||
| 
								 | 
							
								// Storage Backend
							 | 
						||
| 
								 | 
							
								var leStore = require('le-store-certbot').create({
							 | 
						||
| 
								 | 
							
								  configDir: '~/letsencrypt/etc'   // or /etc/letsencrypt or wherever
							 | 
						||
| 
								 | 
							
								, debug: true
							 | 
						||
| 
								 | 
							
								, logsDir: '~/letsencrypt/var/log'
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function leAgree(opts, agreeCb) {
							 | 
						||
| 
								 | 
							
								  // opts = { email, domains, tosUrl }
							 | 
						||
| 
								 | 
							
								  agreeCb(null, opts.tosUrl);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let subdomain = String(Math.random()).replace('.','');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								le = LE.create({
							 | 
						||
| 
								 | 
							
								  server: LE.productionServerUrl                               // Change to LE.productionServerUrl in production
							 | 
						||
| 
								 | 
							
								, challengeType: 'dns-01'
							 | 
						||
| 
								 | 
							
								, challenges: {
							 | 
						||
| 
								 | 
							
								    'dns-01': leChallengeDns
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								, approveDomains: [  subdomain + '.box.knilxof.org' ]
							 | 
						||
| 
								 | 
							
								, agreeToTerms: leAgree                                   // hook to allow user to view and accept LE TOS
							 | 
						||
| 
								 | 
							
								, debug: true
							 | 
						||
| 
								 | 
							
								, store: leStore
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Check in-memory cache of certificates for the named domain
							 | 
						||
| 
								 | 
							
								le.check({ domains: [ subdomain + '.box.knilxof.org' ] }).then(function (results) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (results) {
							 | 
						||
| 
								 | 
							
								        // we already have certificates
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let token;
							 | 
						||
| 
								 | 
							
								    let challenge;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // promise to be called when LE has the dns challenge ready for us
							 | 
						||
| 
								 | 
							
								    leChallengeDns.leDnsResponse = function(challenge, keyAuthorization, keyAuthDigest, challengeDomain, domain){
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        console.info("");
							 | 
						||
| 
								 | 
							
								        console.info("Challenge for '" + domain + "'");
							 | 
						||
| 
								 | 
							
								        console.info("");
							 | 
						||
| 
								 | 
							
								        console.info("We now present (for you copy-and-paste pleasure) your ACME Challenge");
							 | 
						||
| 
								 | 
							
								        console.info("public Challenge and secret KeyAuthorization and Digest, in that order, respectively:");
							 | 
						||
| 
								 | 
							
								        console.info(challenge);
							 | 
						||
| 
								 | 
							
								        console.info(keyAuthorization);
							 | 
						||
| 
								 | 
							
								        console.info(keyAuthDigest);
							 | 
						||
| 
								 | 
							
								        console.info("");
							 | 
						||
| 
								 | 
							
								        console.info(challengeDomain + "\tTXT " + keyAuthDigest + "\tTTL 60");
							 | 
						||
| 
								 | 
							
								        console.info("");
							 | 
						||
| 
								 | 
							
								        console.info(JSON.stringify({
							 | 
						||
| 
								 | 
							
								          domain: domain
							 | 
						||
| 
								 | 
							
								        , challenge: challenge
							 | 
						||
| 
								 | 
							
								        , keyAuthorization: keyAuthorization
							 | 
						||
| 
								 | 
							
								        , keyAuthDigest: keyAuthDigest
							 | 
						||
| 
								 | 
							
								        }, null, '  ').replace(/^/gm, '\t'));
							 | 
						||
| 
								 | 
							
								        console.info("");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return new Promise((resolve, reject) => {
							 | 
						||
| 
								 | 
							
								            // ok now that we have a challenge, we call our gateway to setup the TXT record
							 | 
						||
| 
								 | 
							
								            fetch('http://knilxof.org//dnsconfig?token=' + token + '&challenge=' + keyAuthDigest)
							 | 
						||
| 
								 | 
							
								            .then(function(res) { return res.text(); }).then(function(body) {
							 | 
						||
| 
								 | 
							
								                console.log(body);
							 | 
						||
| 
								 | 
							
								                resolve("Success!");
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    fetch('http://knilxof.org/subscribe?name=' + subdomain)
							 | 
						||
| 
								 | 
							
								        .then(function (res) { return res.text(); })
							 | 
						||
| 
								 | 
							
								        .then(function (body) {
							 | 
						||
| 
								 | 
							
								        const jsonBody = JSON.parse(body);
							 | 
						||
| 
								 | 
							
								        token = jsonBody.token;
							 | 
						||
| 
								 | 
							
								        // Register Let's Encrypt
							 | 
						||
| 
								 | 
							
								        le.register({
							 | 
						||
| 
								 | 
							
								            domains: [subdomain + '.box.knilxof.org']                           // CHANGE TO YOUR DOMAIN (list for SANS)
							 | 
						||
| 
								 | 
							
								            , email: 'john.doe@example.com'                                    // CHANGE TO YOUR EMAIL
							 | 
						||
| 
								 | 
							
								            , agreeTos: true                                              // set to tosUrl string (or true) to pre-approve (and skip agreeToTerms)
							 | 
						||
| 
								 | 
							
								            , rsaKeySize: 2048                                           // 2048 or higher
							 | 
						||
| 
								 | 
							
								            , challengeType: 'dns-01'                                   // http-01, tls-sni-01, or dns-01
							 | 
						||
| 
								 | 
							
								        }).then(function (results) {
							 | 
						||
| 
								 | 
							
								            console.log('success');
							 | 
						||
| 
								 | 
							
								        }, function (err) {
							 | 
						||
| 
								 | 
							
								            console.error('[Error]: node-greenlock/examples/standalone');
							 | 
						||
| 
								 | 
							
								            console.error(err.stack);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 |