mirror of
				https://github.com/therootcompany/greenlock.js.git
				synced 2024-11-16 17:29:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			203 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| Scraps
 | |
| ======
 | |
| 
 | |
| These are examples that we might come back and update (and would love help updating),
 | |
| but they are more likely to cause confusion than success for the casual googled-it-and-got-here-er.
 | |
| 
 | |
| Probably Outdated Examples
 | |
| ========
 | |
| 
 | |
| The simplest example of setting up a webserver appropriately is probably `letsencrypt-cli` (~120 lines of code):
 | |
| 
 | |
| * [letsencrypt-cli//lib/standalone.js](https://github.com/Daplie/node-letsencrypt-cli/blob/master/lib/standalone.js)
 | |
| 
 | |
| Similary, `letsencrypt-cli`'s usage of `le.register()` is fairly simple (~75 lines of code):
 | |
| 
 | |
| * [letsencrypt-cli/bin/letsencrypt.js](https://github.com/Daplie/node-letsencrypt-cli/blob/master/bin/letsencrypt.js)
 | |
| 
 | |
| ### One-Time Registration
 | |
| 
 | |
| Register a 90-day certificate manually, on a whim
 | |
| 
 | |
| **Note**: We've been running a fast development cycle and this example may be out of date.
 | |
| The API *shouldn't* have changed much but, we probably need to come back and update it.
 | |
| 
 | |
| #### Snippets
 | |
| 
 | |
| [`commandline-minimal`](https://github.com/Daplie/node-letsencrypt/blob/master/examples/commandline-minimal.js):
 | |
| 
 | |
| **Part 1: the Let's Encrypt client**:
 | |
| ```javascript
 | |
| 'use strict';
 | |
| 
 | |
| var LE = require('letsencrypt');
 | |
| var config = require('./config-minimal');
 | |
| 
 | |
| // Note: you should make this special dir in your product and leave it empty
 | |
| config.le.webrootPath = __dirname + '/../tests/acme-challenge';
 | |
| config.le.server = LE.stagingServer;
 | |
| 
 | |
| 
 | |
| //
 | |
| // Manual Registration
 | |
| //
 | |
| var le = LE.create(config.backend, config.le);
 | |
| le.register({
 | |
|   agreeTos: true
 | |
| , domains: ['example.com']          // CHANGE TO YOUR DOMAIN
 | |
| , email: 'user@email.com'           // CHANGE TO YOUR EMAIL
 | |
| }, function (err) {
 | |
|   if (err) {
 | |
|     console.error('[Error]: node-letsencrypt/examples/standalone');
 | |
|     console.error(err.stack);
 | |
|   } else {
 | |
|     console.log('success');
 | |
|   }
 | |
| 
 | |
|   plainServer.close();
 | |
|   tlsServer.close();
 | |
| });
 | |
| ```
 | |
| 
 | |
| **Part 2: Express Web Server**:
 | |
| ```javascript
 | |
| //
 | |
| // Express App
 | |
| //
 | |
| var app = require('express')();
 | |
| app.use('/', le.middleware());  // TODO le.middleware was moved to letsencrypt-express, we need to update the docs here
 | |
| 
 | |
| 
 | |
| //
 | |
| // HTTP & HTTPS servers
 | |
| // (required for domain validation)
 | |
| //
 | |
| var plainServer = require('http').createServer(app).listen(config.plainPort, function () {
 | |
|   console.log('Listening http', this.address());
 | |
| });
 | |
| 
 | |
| var tlsServer = require('https').createServer({
 | |
|   key: config.tlsKey
 | |
| , cert: config.tlsCert
 | |
| , SNICallback: le.sniCallback
 | |
| }, app).listen(config.tlsPort, function () {
 | |
|   console.log('Listening http', this.address());
 | |
| });
 | |
| ```
 | |
| 
 | |
| #### Runnable Demo
 | |
| 
 | |
| * [commandline (standalone with "webroot")](https://github.com/Daplie/node-letsencrypt/blob/master/examples/commandline.js)
 | |
| 
 | |
| ```bash
 | |
| # manual standalone registration via commandline
 | |
| # (runs against testing server on tls port 5001)
 | |
| node examples/commandline.js example.com,www.example.com user@example.net agree
 | |
| ```
 | |
| 
 | |
| ### Express
 | |
| 
 | |
| Fully Automatic HTTPS with ExpressJS using Free SSL certificates from Let's Encrypt
 | |
| 
 | |
| #### Snippets
 | |
| 
 | |
| * [Minimal ExpressJS Example](https://github.com/Daplie/node-letsencrypt/blob/master/examples/express-minimal.js)
 | |
| 
 | |
| ```javascript
 | |
| 'use strict';
 | |
| 
 | |
| var LE = require('letsencrypt');
 | |
| var config = require('./config-minimal');
 | |
| 
 | |
| // Note: you should make this special dir in your product and leave it empty
 | |
| config.le.webrootPath = __dirname + '/../tests/acme-challenge';
 | |
| config.le.server = LE.stagingServer;
 | |
| 
 | |
| //
 | |
| // Automatically Register / Renew Domains
 | |
| //
 | |
| var le = LE.create(config.backend, config.le, {
 | |
|   sniRegisterCallback: function (args, expiredCert, cb) {
 | |
|     // Security: check that this is actually a subdomain we allow
 | |
|     // (otherwise an attacker can cause you to rate limit against the LE server)
 | |
| 
 | |
|     var hostname = args.domains[0];
 | |
|     if (!/\.example\.com$/.test(hostname)) {
 | |
|       console.error("bad domain '" + hostname + "', not a subdomain of example.com");
 | |
|       cb(nul, null);
 | |
|     }
 | |
| 
 | |
|     // agree to the LE TOS for this domain
 | |
|     args.agreeTos = true;
 | |
|     args.email = 'user@example.com';
 | |
| 
 | |
|     // use the cert even though it's expired
 | |
|     if (expiredCert) {
 | |
|       cb(null, expiredCert);
 | |
|       cb = function () { /*ignore*/ };
 | |
|     }
 | |
| 
 | |
|     // register / renew the certificate in the background
 | |
|     le.register(args, cb);
 | |
|   }
 | |
| });
 | |
| 
 | |
| 
 | |
| //
 | |
| // Express App
 | |
| //
 | |
| var app = require('express')();
 | |
| app.use('/', le.middleware());
 | |
| 
 | |
| 
 | |
| //
 | |
| // HTTP & HTTPS servers
 | |
| //
 | |
| require('http').createServer(app).listen(config.plainPort, function () {
 | |
|   console.log('Listening http', this.address());
 | |
| });
 | |
| 
 | |
| require('https').createServer({
 | |
|   key: config.tlsKey
 | |
| , cert: config.tlsCert
 | |
| , SNICallback: le.sniCallback
 | |
| }, app).listen(config.tlsPort, function () {
 | |
|   console.log('Listening http', this.address());
 | |
| });
 | |
| ```
 | |
| 
 | |
| #### Runnable Example
 | |
| 
 | |
| * [Full ExpressJS Example](https://github.com/Daplie/node-letsencrypt/blob/master/examples/express.js)
 | |
| 
 | |
| ```bash
 | |
| # clear out the certificates
 | |
| rm -rf tests/letsencrypt.*
 | |
| 
 | |
| # automatic registration and renewal (certs install as you visit the site for the first time)
 | |
| # (runs against testing server on tls port 5001)
 | |
| node examples/express.js example.com,www.example.com user@example.net agree
 | |
| ```
 | |
| 
 | |
| ```bash
 | |
| # this will take a moment because it won't respond to the tls sni header until it gets the certs
 | |
| curl https://example.com/
 | |
| ```
 | |
| 
 | |
| ### non-root
 | |
| 
 | |
| If you want to run this as non-root, you can.
 | |
| 
 | |
| You just have to set node to be allowed to use root ports
 | |
| 
 | |
| ```
 | |
| # node
 | |
| sudo setcap cap_net_bind_service=+ep /usr/local/bin/node
 | |
| ```
 | |
| 
 | |
| and then make sure to set all of of the following to a directory that your user is permitted to write to
 | |
| 
 | |
| * `webrootPath`
 | |
| * `configDir`
 | |
| 
 |