| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | # Greenlock™ for rill
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | An Automated HTTPS ACME client (Let's Encrypt v2) for rill | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | Greenlock™ for | 
					
						
							|  |  |  | [Browsers](https://git.coolaj86.com/coolaj86/greenlock.html), | 
					
						
							|  |  |  | [Node.js](https://git.coolaj86.com/coolaj86/greenlock.js), | 
					
						
							|  |  |  | [Commandline](https://git.coolaj86.com/coolaj86/greenlock-cli.js), | 
					
						
							|  |  |  | [Express.js](https://git.coolaj86.com/coolaj86/greenlock-express.js), | 
					
						
							|  |  |  | [Node.js Cluster](https://git.coolaj86.com/coolaj86/greenlock-cluster.js), | 
					
						
							|  |  |  | [hapi](https://git.coolaj86.com/coolaj86/greenlock-hapi.js), | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | [Koa](https://git.coolaj86.com/coolaj86/greenlock-koa.js), | 
					
						
							|  |  |  | and **rill** | 
					
						
							| 
									
										
										
										
											2018-04-20 06:33:56 +00:00
										 |  |  | | Sponsered by [ppl](https://ppl.family) | 
					
						
							| 
									
										
										
										
											2016-04-22 12:20:15 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | Features | 
					
						
							|  |  |  | ======== | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  |   * [x] Automatic Registration via SNI (`httpsOptions.SNICallback`) | 
					
						
							|  |  |  |   * [x] Secure domain approval callback | 
					
						
							|  |  |  |   * [x] Automatic renewal between 10 and 14 days before expiration | 
					
						
							|  |  |  |   * [x] Virtual Hosting (vhost) with Multiple Domains & SAN | 
					
						
							|  |  |  |   * [x] and [more](https://git.coolaj86.com/coolaj86/greenlock-express.js) | 
					
						
							|  |  |  |   * [x] plugins for AWS, redis, and more | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | This module is just an alias for greenlock-express.js, | 
					
						
							|  |  |  | which works with any middleware system. | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Install
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | npm install --save greenlock-rill@2.x | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | QuickStart | 
					
						
							|  |  |  | ========== | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```javascript | 
					
						
							|  |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | ////////////////////// | 
					
						
							|  |  |  | // Greenlock Setup  // | 
					
						
							|  |  |  | ////////////////////// | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | var greenlock = require('greenlock-rill').create({ | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  |   version: 'draft-11' // Let's Encrypt v2 | 
					
						
							| 
									
										
										
										
											2018-04-20 06:27:36 +00:00
										 |  |  |   // You MUST change this to 'https://acme-v02.api.letsencrypt.org/directory' in production | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | , server: 'https://acme-staging-v02.api.letsencrypt.org/directory' | 
					
						
							| 
									
										
										
										
											2016-08-16 14:58:02 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | , email: 'jon@example.com' | 
					
						
							|  |  |  | , agreeTos: true | 
					
						
							|  |  |  | , approveDomains: [ 'example.com' ] | 
					
						
							| 
									
										
										
										
											2016-08-16 14:58:02 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  |   // Join the community to get notified of important updates | 
					
						
							|  |  |  |   // and help make greenlock better | 
					
						
							|  |  |  | , communityMember: true | 
					
						
							| 
									
										
										
										
											2016-08-16 14:58:02 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | , configDir: require('os').homedir() + '/acme/etc' | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | //, debug: true | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | /////////////////// | 
					
						
							|  |  |  | // Just add rill // | 
					
						
							|  |  |  | /////////////////// | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | var http = require('http'); | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | var https = require('https'); | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | var Rill = require('rill'); | 
					
						
							|  |  |  | var app = new Rill(); | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | app.use(({ req, res }, next)=> { | 
					
						
							|  |  |  |   res.body = 'Hello, World!'; | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | // https server | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | var server = https.createServer(greenlock.tlsOptions, greenlock.middleware(app.handler())); | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | server.listen(443, function () { | 
					
						
							|  |  |  |  console.log('Listening at https://localhost:' + this.address().port); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 14:58:02 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | // http redirect to https | 
					
						
							| 
									
										
										
										
											2016-08-16 14:58:02 -06:00
										 |  |  | var http = require('http'); | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | var redirectHttps = require('redirect-https')(); | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | http.createServer(greenlock.middleware(redirectHttps)).listen(80, function () { | 
					
						
							|  |  |  |   console.log('Listening on port 80 to handle ACME http-01 challenge and redirect to https'); | 
					
						
							| 
									
										
										
										
											2016-04-18 11:07:30 -06:00
										 |  |  | }); | 
					
						
							|  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | Usage & Troubleshooting | 
					
						
							|  |  |  | ============================ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | See <https://git.coolaj86.com/coolaj86/greenlock-express.js> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | Handling a dynamic list of domains | 
					
						
							|  |  |  | ======================== | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | In the oversimplified exapmple above we handle a static list of domains. | 
					
						
							|  |  |  | If you add domains programmatically you'll want to use the `approveDomains` | 
					
						
							|  |  |  | callback. | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | **SECURITY**: Be careful with this. | 
					
						
							|  |  |  | If you don't check that the domains being requested are the domains you | 
					
						
							|  |  |  | allow an attacker can make you hit your rate limit for failed verification | 
					
						
							|  |  |  | attempts. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | We have a | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | [vhost example](https://git.coolaj86.com/coolaj86/greenlock-express.js/src/branch/master/examples/vhost.js) | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | that allows any domain for which there is a folder on the filesystem in a specific location. | 
					
						
							| 
									
										
										
										
											2018-05-10 12:51:54 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:15:49 -06:00
										 |  |  | See that example for an idea of how this is done. |