mirror of
				https://github.com/therootcompany/greenlock-express.js.git
				synced 2025-10-31 03:52:47 +00:00 
			
		
		
		
	simplify
This commit is contained in:
		
							parent
							
								
									b0e2decbc1
								
							
						
					
					
						commit
						200ffa805d
					
				
							
								
								
									
										244
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										244
									
								
								README.md
									
									
									
									
									
								
							| @ -1,6 +1,13 @@ | |||||||
| # LetsEncrypt Express | # LetsEncrypt Express | ||||||
| 
 | 
 | ||||||
| Free SSL and managed or automatic HTTPS for node.js with Express, Koa, Connect, and other middleware systems. | Free SSL and managed or automatic HTTPS for node.js with Express, Koa, Connect, Hapi, and all other middleware systems. | ||||||
|  | 
 | ||||||
|  | * Automatic Registration via SNI (`httpsOptions.SNICallback`) | ||||||
|  |   * **registrations** require an **approval callback** in *production* | ||||||
|  | * Automatic Renewal (around 80 days) | ||||||
|  |   * **renewals** are *fully automatic* and happen in the *background*, with **no downtime** | ||||||
|  | 
 | ||||||
|  | All you have to do is start the webserver and then visit it at it's domain name. | ||||||
| 
 | 
 | ||||||
| ## Install | ## Install | ||||||
| 
 | 
 | ||||||
| @ -10,43 +17,43 @@ npm install --save letsencrypt-express | |||||||
| 
 | 
 | ||||||
| ## Usage | ## Usage | ||||||
| 
 | 
 | ||||||
| **Minimal** |  | ||||||
| 
 |  | ||||||
| ```javascript | ```javascript | ||||||
| 'use strict'; | 'use strict'; | ||||||
| 
 | 
 | ||||||
| // Note: using staging server url, remove .testing() for production | // Note: using staging server url, remove .testing() for production | ||||||
| var lex = require('letsencrypt-express').testing(); | var lex = require('letsencrypt-express').testing(); | ||||||
| 
 | 
 | ||||||
| var express = require('express'); |  | ||||||
| var app = express(); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // A happy little express app | // A happy little express app | ||||||
|  | var app = require('express')(); | ||||||
| app.use(function (req, res) { | app.use(function (req, res) { | ||||||
|   res.send({ success: true }); |   res.send({ success: true }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  | function approveRegistration(hostname, cb) { | ||||||
|  |   // Note: this is the place to check your database to get the user associated with this domain | ||||||
|  |   cb(null, { | ||||||
|  |     domains: [hostname] | ||||||
|  |   , email: 'CHANGE_ME' // user@example.com | ||||||
|  |   , agreeTos: true | ||||||
|  |   }); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| // assumes ~/letsencrypt/etc as the configDir and ports 80, 443, and 5001 by default | lex.create({ | ||||||
| lex.create(app).listen(); |   configDir: '/etc/letsencrypt' | ||||||
|  | , onRequest: app | ||||||
|  | , approveRegistration: approveRegistration                  // leave `null` to disable automatic registration | ||||||
|  | }).listen([80], [443, 5001], function () { | ||||||
|  |   console.log("ENCRYPT __ALL__ THE DOMAINS!"); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // NOTE: | ||||||
|  | // `~/letsencrypt/etc` is the default `configDir` | ||||||
|  | // ports 80, 443, and 5001 are the default ports to listen on. | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ## How Automatic? | **WARNING**: If you don't do any checks and simply complete `approveRegistration` callback, an attacker will spoof SNI packets with bad hostnames and that will cause you to be rate-limited and or blocked from the ACME server. | ||||||
| 
 | 
 | ||||||
| **Extremely**. | Alternatively, You can run **registration** manually: | ||||||
| 
 |  | ||||||
| * **renewals** are *fully automatic* and happen in the *background*, with **no downtime** |  | ||||||
| * **registrations** are automatic in *testing*, but require a **approval callback** in *production* |  | ||||||
| 
 |  | ||||||
| **testing mode** |  | ||||||
| 
 |  | ||||||
| All you have to do is start the webserver and then visit it at it's domain name. |  | ||||||
| The certificate will be retrieved automatically. Renewals and Registrations are automatic. |  | ||||||
| 
 |  | ||||||
| **production mode** |  | ||||||
| 
 |  | ||||||
| You can run **registration** manually: |  | ||||||
| 
 | 
 | ||||||
| ```bash | ```bash | ||||||
| npm install -g letsencrypt-cli | npm install -g letsencrypt-cli | ||||||
| @ -56,27 +63,7 @@ letsencrypt certonly --standalone \ | |||||||
|   --agree-tos --domains example.com --email user@example.com |   --agree-tos --domains example.com --email user@example.com | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| (note that the `--webrootPath` option is also available if you don't want to shut down your webserver to get the cert) | Note: the `--webrootPath` option is also available if you don't want to shut down your webserver to get the cert. | ||||||
| 
 |  | ||||||
| Or you can approve registrations with the `opts.approveRegistration(domain, cb)`callback: |  | ||||||
| 
 |  | ||||||
| ```javascript |  | ||||||
| { configDir: '...' |  | ||||||
| // ... |  | ||||||
| , approveRegistration: function (hostname, cb) { |  | ||||||
|     // check a database or something, get the user |  | ||||||
|     // show them the agreement that you've already downloaded |  | ||||||
|     cb(null, { |  | ||||||
|       domains: [hostname] |  | ||||||
|     , email: 'user@example.com' |  | ||||||
|     , agreeTos: true |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| (if you don't check and simply complete the callback, an attacker will spoof SNI packets with bad hostnames |  | ||||||
| and that will cause you to be rate-limited and or blocked from the ACME server) |  | ||||||
| 
 | 
 | ||||||
| ## Examples | ## Examples | ||||||
| 
 | 
 | ||||||
| @ -172,89 +159,6 @@ lex.create({ | |||||||
| }); | }); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ### < 140 Characters |  | ||||||
| 
 |  | ||||||
| Let's Encrypt in 128 characters, with spaces! |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| node -e 'require("letsencrypt-express").testing().create( require("express")().use(function (_, r) { r.end("Hi!") }) ).listen()' |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### More realistic |  | ||||||
| 
 |  | ||||||
| ```javascript |  | ||||||
| 'use strict'; |  | ||||||
| 
 |  | ||||||
| // Note: using staging server url, remove .testing() for production |  | ||||||
| var LEX = require('letsencrypt-express').testing(); |  | ||||||
| var express = require('express'); |  | ||||||
| var app = express(); |  | ||||||
| 
 |  | ||||||
| app.use('/', function (req, res) { |  | ||||||
|   res.send({ success: true }); |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| LEX.create({ |  | ||||||
|   configDir: './letsencrypt.config'                 // ~/letsencrypt, /etc/letsencrypt, whatever you want |  | ||||||
| 
 |  | ||||||
| , onRequest: app                                    // your express app (or plain node http app) |  | ||||||
| 
 |  | ||||||
| , letsencrypt: null                                 // you can provide you own instance of letsencrypt |  | ||||||
|                                                     // if you need to configure it (with an agreeToTerms |  | ||||||
|                                                     // callback, for example) |  | ||||||
| 
 |  | ||||||
| , approveRegistration: function (hostname, cb) {    // PRODUCTION MODE needs this function, but only if you want |  | ||||||
|                                                     // automatic registration (usually not necessary) |  | ||||||
|                                                     // renewals for registered domains will still be automatic |  | ||||||
|     cb(null, { |  | ||||||
|       domains: [hostname] |  | ||||||
|     , email: 'user@example.com' |  | ||||||
|     , agreeTos: true              // you |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
| }).listen([80], [443, 5001], function () { |  | ||||||
|   console.log("ENCRYPT __ALL__ THE DOMAINS!"); |  | ||||||
| }); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### More Options Exposed |  | ||||||
| 
 |  | ||||||
| ```javascript |  | ||||||
| 'use strict'; |  | ||||||
| 
 |  | ||||||
| var lex = require('letsencrypt-express'); |  | ||||||
| var express = require('express'); |  | ||||||
| var app = express(); |  | ||||||
| 
 |  | ||||||
| app.use('/', function (req, res) { |  | ||||||
|   res.send({ success: true }); |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| var results = lex.create({ |  | ||||||
|   configDir: '/etc/letsencrypt' |  | ||||||
| , onRequest: app |  | ||||||
| , server: require('letsencrypt').productionServerUrl |  | ||||||
| }).listen( |  | ||||||
| 
 |  | ||||||
|   // you can give just the port, or expand out to the full options |  | ||||||
|   [80, { port: 8080, address: 'localhost', onListening: function () { console.log('http://localhost'); } }] |  | ||||||
| 
 |  | ||||||
|   // you can give just the port, or expand out to the full options |  | ||||||
| , [443, 5001, { port: 8443, address: 'localhost' }] |  | ||||||
| 
 |  | ||||||
|   // this is pretty much the default onListening handler |  | ||||||
| , function onListening() { |  | ||||||
|     var server = this; |  | ||||||
|     var protocol = ('requestCert' in server) ? 'https': 'http'; |  | ||||||
|     console.log("Listening at " + protocol + '://localhost:' + this.address().port); |  | ||||||
|   } |  | ||||||
| ); |  | ||||||
| 
 |  | ||||||
| // In case you need access to the raw servers (i.e. using websockets) |  | ||||||
| console.log(results.plainServers); |  | ||||||
| console.log(results.tlsServers); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### WebSockets with Let's Encrypt | ### WebSockets with Let's Encrypt | ||||||
| 
 | 
 | ||||||
| Note: you don't need to create websockets for the plain ports. | Note: you don't need to create websockets for the plain ports. | ||||||
| @ -390,6 +294,92 @@ server: url                     // url        use letsencrypt.productionServerUr | |||||||
|                                 // default    production |                                 // default    production | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | ## More Examples | ||||||
|  | 
 | ||||||
|  | ### < 140 Characters | ||||||
|  | 
 | ||||||
|  | Let's Encrypt in 128 characters, with spaces! | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | node -e 'require("letsencrypt-express").testing().create( require("express")().use(function (_, r) { r.end("Hi!") }) ).listen()' | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### More realistic | ||||||
|  | 
 | ||||||
|  | ```javascript | ||||||
|  | 'use strict'; | ||||||
|  | 
 | ||||||
|  | // Note: using staging server url, remove .testing() for production | ||||||
|  | var LEX = require('letsencrypt-express').testing(); | ||||||
|  | var express = require('express'); | ||||||
|  | var app = express(); | ||||||
|  | 
 | ||||||
|  | app.use('/', function (req, res) { | ||||||
|  |   res.send({ success: true }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | LEX.create({ | ||||||
|  |   configDir: './letsencrypt.config'                 // ~/letsencrypt, /etc/letsencrypt, whatever you want | ||||||
|  | 
 | ||||||
|  | , onRequest: app                                    // your express app (or plain node http app) | ||||||
|  | 
 | ||||||
|  | , letsencrypt: null                                 // you can provide you own instance of letsencrypt | ||||||
|  |                                                     // if you need to configure it (with an agreeToTerms | ||||||
|  |                                                     // callback, for example) | ||||||
|  | 
 | ||||||
|  | , approveRegistration: function (hostname, cb) {    // PRODUCTION MODE needs this function, but only if you want | ||||||
|  |                                                     // automatic registration (usually not necessary) | ||||||
|  |                                                     // renewals for registered domains will still be automatic | ||||||
|  |     cb(null, { | ||||||
|  |       domains: [hostname] | ||||||
|  |     , email: 'user@example.com' | ||||||
|  |     , agreeTos: true              // you | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | }).listen([80], [443, 5001], function () { | ||||||
|  |   console.log("ENCRYPT __ALL__ THE DOMAINS!"); | ||||||
|  | }); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### More Options Exposed | ||||||
|  | 
 | ||||||
|  | ```javascript | ||||||
|  | 'use strict'; | ||||||
|  | 
 | ||||||
|  | var lex = require('letsencrypt-express'); | ||||||
|  | var express = require('express'); | ||||||
|  | var app = express(); | ||||||
|  | 
 | ||||||
|  | app.use('/', function (req, res) { | ||||||
|  |   res.send({ success: true }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | var results = lex.create({ | ||||||
|  |   configDir: '/etc/letsencrypt' | ||||||
|  | , onRequest: app | ||||||
|  | , server: require('letsencrypt').productionServerUrl | ||||||
|  | }).listen( | ||||||
|  | 
 | ||||||
|  |   // you can give just the port, or expand out to the full options | ||||||
|  |   [80, { port: 8080, address: 'localhost', onListening: function () { console.log('http://localhost'); } }] | ||||||
|  | 
 | ||||||
|  |   // you can give just the port, or expand out to the full options | ||||||
|  | , [443, 5001, { port: 8443, address: 'localhost' }] | ||||||
|  | 
 | ||||||
|  |   // this is pretty much the default onListening handler | ||||||
|  | , function onListening() { | ||||||
|  |     var server = this; | ||||||
|  |     var protocol = ('requestCert' in server) ? 'https': 'http'; | ||||||
|  |     console.log("Listening at " + protocol + '://localhost:' + this.address().port); | ||||||
|  |   } | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | // In case you need access to the raw servers (i.e. using websockets) | ||||||
|  | console.log(results.plainServers); | ||||||
|  | console.log(results.tlsServers); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| ### Fullest Example Ever | ### Fullest Example Ever | ||||||
| 
 | 
 | ||||||
| Here's absolutely every option and function exposed | Here's absolutely every option and function exposed | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user