mirror of
				https://github.com/therootcompany/greenlock-express.js.git
				synced 2024-11-16 17:28:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
// opts = { renewWithin, renew, register, httpsOptions }
 | 
						|
module.exports.create = function (opts) {
 | 
						|
  var tls = require('tls');
 | 
						|
 | 
						|
  var snicb = {
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    // in-process cache
 | 
						|
    _ipc: {}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    // just to account for clock skew
 | 
						|
  , _fiveMin: 5 * 60 * 1000
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    // cache and format incoming certs
 | 
						|
  , cacheCerts: function (certs) {
 | 
						|
      certs.altnames.forEach(function (domain) {
 | 
						|
        snicb._ipc[domain] = { subject: certs.subject };
 | 
						|
      });
 | 
						|
      snicb._ipc[certs.subject] = certs;
 | 
						|
 | 
						|
      certs.tlsContext = tls.createSecureContext({
 | 
						|
        key: certs.privkey
 | 
						|
      , cert: certs.cert + certs.chain
 | 
						|
      , rejectUnauthorized: opts.httpsOptions.rejectUnauthorized
 | 
						|
 | 
						|
      , requestCert: opts.httpsOptions.requestCert  // request peer verification
 | 
						|
      , ca: opts.httpsOptions.ca                    // this chain is for incoming peer connctions
 | 
						|
      , crl: opts.httpsOptions.crl                  // this crl is for incoming peer connections
 | 
						|
      });
 | 
						|
 | 
						|
      return certs;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    // automate certificate registration on request
 | 
						|
  , sniCallback: function (domain, cb) {
 | 
						|
      var certs = snicb._ipc[domain];
 | 
						|
      var promise;
 | 
						|
      var now = Date.now();
 | 
						|
 | 
						|
      if (certs && certs.subject !== domain) {
 | 
						|
        certs = snicb._ipc[domain];
 | 
						|
      }
 | 
						|
 | 
						|
      // err just barely on the side of safety
 | 
						|
      if (!certs) {
 | 
						|
        promise = opts.register(domain);
 | 
						|
      }
 | 
						|
      else if (now >= (certs.expiresAt - snicb._fiveMin)) {
 | 
						|
        promise = opts.renew(domain, certs);
 | 
						|
      }
 | 
						|
      else {
 | 
						|
        if (now >= (certs.expiresAt - opts.renewWithin)) {
 | 
						|
          // in background
 | 
						|
          opts.renew(domain, certs).then(snicb.cacheCerts);
 | 
						|
        }
 | 
						|
        cb(null, certs);
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      promise.then(snicb.cacheCerts).then(function (certs) {
 | 
						|
        cb(null, certs.tlsContext);
 | 
						|
      }, cb);
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
  return snicb;
 | 
						|
};
 |