simplify
This commit is contained in:
		
							parent
							
								
									200ffa805d
								
							
						
					
					
						commit
						2a73771ed6
					
				
							
								
								
									
										125
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								README.md
									
									
									
									
									
								
							| @ -6,6 +6,7 @@ Free SSL and managed or automatic HTTPS for node.js with Express, Koa, Connect, | |||||||
|   * **registrations** require an **approval callback** in *production* |   * **registrations** require an **approval callback** in *production* | ||||||
| * Automatic Renewal (around 80 days) | * Automatic Renewal (around 80 days) | ||||||
|   * **renewals** are *fully automatic* and happen in the *background*, with **no downtime** |   * **renewals** are *fully automatic* and happen in the *background*, with **no downtime** | ||||||
|  | * Automatic vhost / virtual hosting | ||||||
| 
 | 
 | ||||||
| All you have to do is start the webserver and then visit it at it's domain name. | All you have to do is start the webserver and then visit it at it's domain name. | ||||||
| 
 | 
 | ||||||
| @ -17,17 +18,19 @@ npm install --save letsencrypt-express | |||||||
| 
 | 
 | ||||||
| ## Usage | ## Usage | ||||||
| 
 | 
 | ||||||
|  | * standalone | ||||||
|  | * express | ||||||
|  | * http / https | ||||||
|  | * http / http2 | ||||||
|  | * koa | ||||||
|  | 
 | ||||||
|  | ### Setup | ||||||
|  | 
 | ||||||
| ```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(); | ||||||
| 
 |  | ||||||
| // A happy little express app |  | ||||||
| var app = require('express')(); |  | ||||||
| app.use(function (req, res) { |  | ||||||
|   res.send({ success: true }); |  | ||||||
| }); |  | ||||||
| 
 | 
 | ||||||
| function approveRegistration(hostname, cb) { | function approveRegistration(hostname, cb) { | ||||||
|   // Note: this is the place to check your database to get the user associated with this domain |   // Note: this is the place to check your database to get the user associated with this domain | ||||||
| @ -38,17 +41,10 @@ function approveRegistration(hostname, cb) { | |||||||
|   }); |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| lex.create({ | var lex = LEX.create({ | ||||||
|   configDir: '/etc/letsencrypt' |   configDir: require('os').homedir() + '/letsencrypt/etc' | ||||||
| , onRequest: app |  | ||||||
| , approveRegistration: approveRegistration                  // leave `null` to disable automatic registration | , 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. |  | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| **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. | **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. | ||||||
| @ -65,33 +61,49 @@ letsencrypt certonly --standalone \ | |||||||
| 
 | 
 | ||||||
| Note: 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. | ||||||
| 
 | 
 | ||||||
| ## Examples | ### Standalone | ||||||
| 
 | 
 | ||||||
| * https / express | ```javascript | ||||||
| * http2 / express | lex.onRequest = function (req, res) { | ||||||
| * koa |   res.end('Hello, World!'); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | lex.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. | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Express | ||||||
|  | 
 | ||||||
|  | ```javascript | ||||||
|  | // A happy little express app | ||||||
|  | var app = require('express')(); | ||||||
|  | 
 | ||||||
|  | app.use(function (req, res) { | ||||||
|  |   res.send({ success: true }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | lex.onRequest = app; | ||||||
|  | 
 | ||||||
|  | lex.listen([80], [443, 5001], function () { | ||||||
|  |   var protocol = ('requestCert' in this) ? 'https': 'http'; | ||||||
|  |   console.log("Listening at " + protocol + '://localhost:' + this.address().port); | ||||||
|  | }); | ||||||
|  | ``` | ||||||
| 
 | 
 | ||||||
| ### Use with raw http / https modules | ### Use with raw http / https modules | ||||||
| 
 | 
 | ||||||
| Let's say you want to redirect all http to https. | Let's say you want to redirect all http to https. | ||||||
| 
 | 
 | ||||||
| ```javascript | ```javascript | ||||||
| var LEX = require('letsencrypt-express'); |  | ||||||
| var http = require('http'); | var http = require('http'); | ||||||
| var https = require('http2'); | var https = require('http2'); | ||||||
| // NOTE: you could use the old https module if for some reason you don't want to support modern browsers | // NOTE: you could use the old https module if for some reason you don't want to support modern browsers | ||||||
| 
 | 
 | ||||||
| var lex = LEX.create({ |  | ||||||
|   configDir: __dirname + '/letsencrypt.config' |  | ||||||
| , approveRegistration: function (hostname, cb) { |  | ||||||
|     cb(null, { |  | ||||||
|       domains: [hostname] |  | ||||||
|     , email: 'CHANGE_ME' // 'user@example.com' |  | ||||||
|     , agreeTos: true |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| function redirectHttp() { | function redirectHttp() { | ||||||
|   http.createServer(LEX.createAcmeResponder(lex, function redirectHttps(req, res) { |   http.createServer(LEX.createAcmeResponder(lex, function redirectHttps(req, res) { | ||||||
|     res.setHeader('Location', 'https://' + req.headers.host + req.url); |     res.setHeader('Location', 'https://' + req.headers.host + req.url); | ||||||
| @ -113,49 +125,19 @@ redirectHttp(); | |||||||
| serveHttps(); | serveHttps(); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| In short these are the only functions you need to be aware of: | ### Let's Encrypt with Koa | ||||||
| 
 |  | ||||||
| * `LEX.create(opts)` |  | ||||||
|   * `{ configDir: pathname, approveRegistration: func }` |  | ||||||
| * `LEX.createAcmeResponder(lex, onRequest)` |  | ||||||
| 
 |  | ||||||
| ### Using with Koa |  | ||||||
| 
 | 
 | ||||||
| ```javascript | ```javascript | ||||||
| 'use strict'; |  | ||||||
| 
 |  | ||||||
| // Note: using staging server url, remove .testing() for production |  | ||||||
| var lex = require('letsencrypt-express').testing(); |  | ||||||
| var koa = require('koa'); | var koa = require('koa'); | ||||||
| var app = koa(); | var app = koa(); | ||||||
| 
 | 
 | ||||||
| 
 | app.use(function *() { | ||||||
| app.use(function *(){ |  | ||||||
|   this.body = 'Hello World'; |   this.body = 'Hello World'; | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| lex.create({ | var server = require('http2').createServer(lex.httpsOptions, LEX.createAcmeResponder(lex, app.callback())); | ||||||
|   configDir: './letsencrypt.config'                 // ~/letsencrypt, /etc/letsencrypt, whatever you want | server.listen(443, function () { | ||||||
| 
 |  console.log('Listening at https://localhost:' + this.address().port); | ||||||
| , onRequest: app.callback()                         // your koa app callback |  | ||||||
| 
 |  | ||||||
| , 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([], [4443], function () { |  | ||||||
|   var server = this; |  | ||||||
|   var protocol = ('requestCert' in server) ? 'https': 'http'; |  | ||||||
|   console.log("Listening at " + protocol + '://localhost:' + this.address().port); |  | ||||||
| }); | }); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| @ -165,11 +147,12 @@ Note: you don't need to create websockets for the plain ports. | |||||||
| 
 | 
 | ||||||
| ```javascript | ```javascript | ||||||
| var WebSocketServer = require('ws').Server; | var WebSocketServer = require('ws').Server; | ||||||
|  | var https = require('http2'); | ||||||
|  | var server = https.createServer(lex.httpsOptions, LEX.createAcmeResponder(lex, app)); | ||||||
|  | var wss = new WebSocketServer({ server: server }); | ||||||
| 
 | 
 | ||||||
| results.tlsServers.forEach(function (server) { | wss.on('connection', onConnection); | ||||||
|   var wss = new WebSocketServer({ server: server }); | server.listen(443); | ||||||
|   wss.on('connection', onConnection); |  | ||||||
| }); |  | ||||||
| 
 | 
 | ||||||
| function onConnection(ws) { | function onConnection(ws) { | ||||||
|   var location = url.parse(ws.upgradeReq.url, true); |   var location = url.parse(ws.upgradeReq.url, true); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user