mirror of
				https://github.com/therootcompany/greenlock.js.git
				synced 2024-11-16 17:29:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var fs = require('fs');
 | |
| var path = require('path');
 | |
| var https = require('https');
 | |
| var http = require('http');
 | |
| var express = require('express');
 | |
| var app = express();
 | |
| 
 | |
| module.exports.create = function (opts) {
 | |
|   function getSecureContext(domainname, opts, cb) {
 | |
| 
 | |
|     if (!opts) { opts = {}; }
 | |
| 
 | |
|     opts.key = fs.readFileSync(path.join(opts.configDir, 'live', domainname, 'privkey.pem'));
 | |
|     opts.cert = fs.readFileSync(path.join(opts.configDir, 'live', domainname, 'cert.pem'));
 | |
|     /*
 | |
|     opts.ca = fs.readFileSync(path.join(opts.configDir, 'live', domainname, 'chain.pem'), 'ascii')
 | |
|       .split('-----END CERTIFICATE-----')
 | |
|       .filter(function (ca) {
 | |
|         return ca.trim();
 | |
|       }).map(function (ca) {
 | |
|         return (ca + '-----END CERTIFICATE-----').trim();
 | |
|       });
 | |
|     */
 | |
| 
 | |
|     cb(null, require('tls').createSecureContext(opts));
 | |
|   }
 | |
| 
 | |
| 
 | |
|   // log the requests
 | |
|   app.use('/', function (req, res, next) {
 | |
|     console.log('[' + req.ip + ']', req.method + ' ' + req.headers.host, req.protocol + req.url);
 | |
|     next();
 | |
|   });
 | |
|   // handle static requests to /.well-known/acme-challenge
 | |
|   app.use(
 | |
|     '/.well-known/acme-challenge'
 | |
|   , express.static(opts.webrootPath, { dotfiles: undefined })
 | |
|   );
 | |
| 
 | |
|   function serveHttps() {
 | |
|     //
 | |
|     // SSL Certificates
 | |
|     //
 | |
|     var server;
 | |
|     var localCerts = require('localhost.daplie.com-certificates');
 | |
|     var options = {
 | |
|       requestCert: false
 | |
|     , rejectUnauthorized: true
 | |
| 
 | |
|       // If you need to use SNICallback you should be using io.js >= 1.x (possibly node >= 0.12)
 | |
|     , SNICallback: function (domainname, cb) {
 | |
|         var secureContext = getSecureContext(domainname);
 | |
|         cb(null, secureContext);
 | |
|       }
 | |
|       // If you need to support HTTP2 this is what you need to work with
 | |
|     //, NPNProtocols: ['http/2.0', 'http/1.1', 'http/1.0']
 | |
|     //, NPNProtocols: ['http/1.1']
 | |
|     , key: localCerts.key
 | |
|     , cert: localCerts.cert
 | |
|     //, ca: null
 | |
|     };
 | |
| 
 | |
|     // Start the tls sni server4
 | |
|     server = https.createServer(options);
 | |
|     server.on('error', function (err) {
 | |
|       console.error(err);
 | |
|     });
 | |
|     server.on('request', app);
 | |
|     server.listen(opts.tlsSni01Port, function () {
 | |
|       console.log('[https] Listening', server.address());
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   function serveHttp() {
 | |
|     // Start the http server4
 | |
|     var insecureServer = http.createServer();
 | |
|     insecureServer.on('error', function (err) {
 | |
|       console.error(err);
 | |
|     });
 | |
|     // note that request handler must be attached *before* and handle comes in
 | |
|     insecureServer.on('request', app);
 | |
|     insecureServer.listen(opts.http01Port, function () {
 | |
|       console.log('[http] Listening', insecureServer.address());
 | |
|     });
 | |
|   }
 | |
| 
 | |
| 
 | |
|   serveHttps();
 | |
|   serveHttp();
 | |
| };
 |