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); | ||
|  |         }); | ||
|  |     }); | ||
|  | }); | ||
|  | 
 |