isolate sniCallback logic
This commit is contained in:
		
							parent
							
								
									b5a86b66e0
								
							
						
					
					
						commit
						c15f16cfe4
					
				
							
								
								
									
										61
									
								
								lib/sni-callback.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								lib/sni-callback.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | |||||||
|  | 'use strict'; | ||||||
|  | 
 | ||||||
|  | // renewWithin, renew, register, httpsOptions
 | ||||||
|  | module.exports.create = function (opts) { | ||||||
|  |   var tls = require('tls'); | ||||||
|  |   // just to account for clock skew
 | ||||||
|  |   var fiveMin = 5 * 60 * 1000; | ||||||
|  |   var snicb = { | ||||||
|  |     // in-process cache
 | ||||||
|  |     _ipc: {} | ||||||
|  |   , 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; | ||||||
|  |     } | ||||||
|  |   , 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 - fiveMin)) { | ||||||
|  |         promise = opts.renew(domain, certs); | ||||||
|  |       } | ||||||
|  |       else { | ||||||
|  |         if (now >= (certs.expiresAt - opts.renewWithin)) { | ||||||
|  |           // in background
 | ||||||
|  |           opts.renew(domain, certs); | ||||||
|  |         } | ||||||
|  |         cb(null, certs); | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       promise.then(snicb.cacheCerts).then(function (certs) { | ||||||
|  |         cb(null, certs.tlsContext); | ||||||
|  |       }, cb); | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   return snicb; | ||||||
|  | }; | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user