v2.4.7: fix false domain fronting error on Firefox
This commit is contained in:
		
							parent
							
								
									108e59ef8b
								
							
						
					
					
						commit
						62bd2ab4c7
					
				
							
								
								
									
										47
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								index.js
									
									
									
									
									
								
							| @ -333,6 +333,38 @@ Greenlock.create = function (gl) { | |||||||
| 
 | 
 | ||||||
|   gl.sni = gl.sni || null; |   gl.sni = gl.sni || null; | ||||||
|   gl.tlsOptions = gl.tlsOptions || gl.httpsOptions || {}; |   gl.tlsOptions = gl.tlsOptions || gl.httpsOptions || {}; | ||||||
|  | 
 | ||||||
|  |   // Workaround for https://github.com/nodejs/node/issues/22389
 | ||||||
|  |   gl._updateServernames = function (cert) { | ||||||
|  |     if (!gl._certnames) { gl._certnames = {}; } | ||||||
|  | 
 | ||||||
|  |     // Note: Any given domain could exist on multiple certs
 | ||||||
|  |     // (especially during renewal where some may be added)
 | ||||||
|  |     // hence we use a separate object for each domain and list each domain on it
 | ||||||
|  |     // to get the minimal full set associated with each cert and domain
 | ||||||
|  |     var allDomains = [cert.subject].concat(cert.altnames.slice(0)); | ||||||
|  |     allDomains.forEach(function (name) { | ||||||
|  |       name = name.toLowerCase(); | ||||||
|  |       if (!gl._certnames[name]) { | ||||||
|  |         gl._certnames[name] = {}; | ||||||
|  |       } | ||||||
|  |       allDomains.forEach(function (name2) { | ||||||
|  |         name2 = name2.toLowerCase(); | ||||||
|  |         gl._certnames[name][name2] = true; | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  |   }; | ||||||
|  |   gl._checkServername = function (safeHost, servername) { | ||||||
|  |     // odd, but acceptable
 | ||||||
|  |     if (!safeHost || !servername) { return true; } | ||||||
|  |     if (safeHost === servername) { return true; } | ||||||
|  |     // connection established with servername and session is re-used for allowed name
 | ||||||
|  |     if (gl._certnames[servername] && gl._certnames[servername][safeHost]) { | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |     return false; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|   if (!gl.tlsOptions.SNICallback) { |   if (!gl.tlsOptions.SNICallback) { | ||||||
|     if (!gl.getCertificatesAsync && !gl.getCertificates) { |     if (!gl.getCertificatesAsync && !gl.getCertificates) { | ||||||
|       if (Array.isArray(gl.approveDomains)) { |       if (Array.isArray(gl.approveDomains)) { | ||||||
| @ -399,7 +431,11 @@ Greenlock.create = function (gl) { | |||||||
|             if (results.certs) { |             if (results.certs) { | ||||||
|               log(gl.debug, 'gl renewing'); |               log(gl.debug, 'gl renewing'); | ||||||
|               return gl.core.certificates.renewAsync(results.options, results.certs).then( |               return gl.core.certificates.renewAsync(results.options, results.certs).then( | ||||||
|                 function (certs) { cb(null, certs); } |                 function (certs) { | ||||||
|  |                   // Workaround for https://github.com/nodejs/node/issues/22389
 | ||||||
|  |                   gl._updateServernames(certs); | ||||||
|  |                   cb(null, certs); | ||||||
|  |                 } | ||||||
|               , function (e) { |               , function (e) { | ||||||
|                   console.debug("Error renewing certificate for '" + domain + "':"); |                   console.debug("Error renewing certificate for '" + domain + "':"); | ||||||
|                   console.debug(e); |                   console.debug(e); | ||||||
| @ -411,7 +447,11 @@ Greenlock.create = function (gl) { | |||||||
|             else { |             else { | ||||||
|               log(gl.debug, 'gl getting from disk or registering new'); |               log(gl.debug, 'gl getting from disk or registering new'); | ||||||
|               return gl.core.certificates.getAsync(results.options).then( |               return gl.core.certificates.getAsync(results.options).then( | ||||||
|                 function (certs) { cb(null, certs); } |                 function (certs) { | ||||||
|  |                   // Workaround for https://github.com/nodejs/node/issues/22389
 | ||||||
|  |                   gl._updateServernames(certs); | ||||||
|  |                   cb(null, certs); | ||||||
|  |                 } | ||||||
|               , function (e) { |               , function (e) { | ||||||
|                   console.debug("Error loading/registering certificate for '" + domain + "':"); |                   console.debug("Error loading/registering certificate for '" + domain + "':"); | ||||||
|                   console.debug(e); |                   console.debug(e); | ||||||
| @ -519,7 +559,8 @@ Greenlock.create = function (gl) { | |||||||
| 
 | 
 | ||||||
|       if (!gl.__sni_allow_domain_fronting) { |       if (!gl.__sni_allow_domain_fronting) { | ||||||
|         if (req.socket && 'string' === typeof req.socket.servername) { |         if (req.socket && 'string' === typeof req.socket.servername) { | ||||||
|           if (safehost && (safehost !== req.socket.servername.toLowerCase())) { |           // Workaround for https://github.com/nodejs/node/issues/22389
 | ||||||
|  |           if (!gl._checkServername(safehost, req.socket.servername.toLowerCase())) { | ||||||
|             res.statusCode = 400; |             res.statusCode = 400; | ||||||
|             res.setHeader('Content-Type', 'text/html; charset=utf-8'); |             res.setHeader('Content-Type', 'text/html; charset=utf-8'); | ||||||
|             res.end( |             res.end( | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "greenlock", |   "name": "greenlock", | ||||||
|   "version": "2.4.4", |   "version": "2.4.7", | ||||||
|   "description": "Let's Encrypt for node.js on npm", |   "description": "Let's Encrypt for node.js on npm", | ||||||
|   "main": "index.js", |   "main": "index.js", | ||||||
|   "files": [ |   "files": [ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user