update docs
This commit is contained in:
		
							parent
							
								
									2d5125821e
								
							
						
					
					
						commit
						e6a008d498
					
				
							
								
								
									
										426
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										426
									
								
								README.md
									
									
									
									
									
								
							| @ -1,33 +1,111 @@ | ||||
| # [Greenlock Express](https://git.rootprojects.org/root/greenlock-express.js) is Let's Encrypt for Node | ||||
| 
 | ||||
| | Built by [Root](https://therootcompany.com) for [Hub](https://rootprojects.org/hub/) | | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| | Built by [Root](https://therootcompany.com) for [Hub](https://rootprojects.org/hub/) | ||||
| 
 | ||||
| Free SSL, Automated HTTPS / HTTP2, served with Node via Express, Koa, hapi, etc. | ||||
| 
 | ||||
| ### Let's Encrypt for Node and Express (and Koa, hapi, rill, etc) | ||||
| ### Free SSL for Node Web Servers | ||||
| 
 | ||||
| Greenlock Express is a **Web Server** with **Fully Automated HTTPS** and renewals. | ||||
| 
 | ||||
| You define your app, and let Greenlock handle issuing and renewing Free SSL Certificates. | ||||
| 
 | ||||
| **Cloud-ready** with Node `cluster`. | ||||
| 
 | ||||
| # Serve your Sites with Free SSL | ||||
| 
 | ||||
| -   1. Create a Project with Greenlock Express | ||||
| -   2. Initialize and Setup | ||||
| -   3. Add Domains, and Hello, World! | ||||
| You define your app and let Greenlock handle issuing and renewing Free SSL Certificates. | ||||
| 
 | ||||
| ```bash | ||||
| npm init | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| npm install --save greenlock-express@v4 | ||||
| ``` | ||||
| 
 | ||||
| `server.js`: | ||||
| 
 | ||||
| ```js | ||||
| "use strict"; | ||||
| 
 | ||||
| var app = require("./app.js"); | ||||
| 
 | ||||
| require("greenlock-express") | ||||
|     .init({ | ||||
|         packageRoot: __dirname, | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         // contact for security and critical bug notices | ||||
|         maintainerEmail: "jon@example.com", | ||||
| 
 | ||||
|         // whether or not to run at cloudscale | ||||
|         cluster: false | ||||
|     }) | ||||
|     // Serves on 80 and 443 | ||||
|     // Get's SSL certificates magically! | ||||
|     .serve(app); | ||||
| ``` | ||||
| 
 | ||||
| `./greenlock.d/config.json`: | ||||
| 
 | ||||
| ```json | ||||
| { "sites": [{ "subject": "example.com", "altnames": ["example.com"] }] } | ||||
| ``` | ||||
| 
 | ||||
| # Let's Encrypt for... | ||||
| 
 | ||||
| -   IoT | ||||
| -   Enterprise On-Prem | ||||
| -   Local Development | ||||
| -   Home Servers | ||||
| -   Quitting Heroku | ||||
| 
 | ||||
| # Features | ||||
| 
 | ||||
| -   [x] Let's Encrypt v2 (November 2019) | ||||
|     -   [x] ACME Protocol (RFC 8555) | ||||
|     -   [x] HTTP Validation (HTTP-01) | ||||
|     -   [x] DNS Validation (DNS-01) | ||||
|     -   [ ] ALPN Validation (TLS-ALPN-01) | ||||
|         -   Need ALPN validation? [contact us](mailto:greenlock-support@therootcompany.com) | ||||
| -   [x] Automated HTTPS | ||||
|     -   [x] Fully Automatic Renewals every 45 days | ||||
|     -   [x] Free SSL | ||||
|     -   [x] **Wildcard** SSL | ||||
|     -   [x] **Localhost** certificates | ||||
|     -   [x] HTTPS-enabled Secure **WebSockets** (`wss://`) | ||||
|     -   [x] **Cloud-ready** with Node `cluster`. | ||||
| -   [x] Fully customizable | ||||
|     -   [x] **Reasonable defaults** | ||||
|     -   [x] Domain Management | ||||
|     -   [x] Key and Certificate Management | ||||
|     -   [x] ACME Challenge Plugins | ||||
| 
 | ||||
| # Compatibility | ||||
| 
 | ||||
| Works with _any_ node http app, including | ||||
| 
 | ||||
| -   [x] Express | ||||
| -   [x] Koa | ||||
| -   [x] hapi | ||||
| -   [x] rill | ||||
| -   [x] http2 | ||||
| -   [x] cluster | ||||
| -   [x] etc... | ||||
| 
 | ||||
| # QuickStart: Serve Sites with Free SSL | ||||
| 
 | ||||
| Easy as 1, 2, 3... 4 | ||||
| 
 | ||||
| 1. Create a Project with Greenlock Express | ||||
|     - `server.js` | ||||
|     - `app.js` | ||||
| 2. Setup the config file (or database) | ||||
|     - `greenlock.d/config.json` | ||||
| 3. Add Domains | ||||
|     - `npx greenlock add --subject example.com --altnames example.com` | ||||
| 4. Hello, World! | ||||
|     - `npm start -- --staging` | ||||
| 
 | ||||
| ```bash | ||||
| npm init | ||||
| npm install --save greenlock-express@v4 | ||||
| ``` | ||||
| 
 | ||||
| You can use **local file storage** or a **database**. The default is to use file storage. | ||||
| 
 | ||||
| ```bash | ||||
| npx greenlock init --config-dir ./greenlock.d --maintainer-email 'jon@example.com' | ||||
| ``` | ||||
| @ -101,303 +179,11 @@ Listening on 0.0.0.0:80 for ACME challenges and HTTPS redirects | ||||
| Listening on 0.0.0.0:443 for secure traffic | ||||
| ``` | ||||
| 
 | ||||
| # Let's Encrypt for... | ||||
| ## Walkthrough | ||||
| 
 | ||||
| -   IoT | ||||
| -   Enterprise On-Prem | ||||
| -   Local Development | ||||
| -   Home Servers | ||||
| -   Quitting Heroku | ||||
| Read the [WALKTHROUGH](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/WALKTHROUGH.md) | ||||
| 
 | ||||
| # Features | ||||
| 
 | ||||
| -   [x] Let's Encrypt v2 (November 2019) | ||||
|     -   [x] ACME Protocol (RFC 8555) | ||||
|     -   [x] HTTP Validation (HTTP-01) | ||||
|     -   [x] DNS Validation (DNS-01) | ||||
|     -   [ ] ALPN Validation (TLS-ALPN-01) | ||||
|         -   Need ALPN validation? [contact us](mailto:greenlock-support@therootcompany.com) | ||||
| -   [x] Automated HTTPS | ||||
|     -   [x] Fully Automatic Renewals every 45 days | ||||
|     -   [x] Free SSL | ||||
|     -   [x] **Wildcard** SSL | ||||
|     -   [x] **Localhost** certificates | ||||
|     -   [x] HTTPS-enabled Secure **WebSockets** (`wss://`) | ||||
| -   [x] Fully customizable | ||||
|     -   [x] **Reasonable defaults** | ||||
|     -   [x] Domain Management | ||||
|     -   [x] Key and Certificate Management | ||||
|     -   [x] ACME Challenge Plugins | ||||
| 
 | ||||
| # QuickStart Guide | ||||
| 
 | ||||
| Easy as 1, 2, 3... 4 | ||||
| 
 | ||||
| <details> | ||||
| <summary>1. Create a node project</summary> | ||||
| 
 | ||||
| ## 1. Create a node project | ||||
| 
 | ||||
| Create an empty node project. | ||||
| 
 | ||||
| Be sure to fill out the package name, version, and an author email. | ||||
| 
 | ||||
| ```bash | ||||
| mkdir ~/my-project | ||||
| pushd ~/my-project | ||||
| npm init | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
| <summary>2. Create an http app (i.e. express)</summary> | ||||
| 
 | ||||
| ## 2. Create an http app (i.e. express) | ||||
| 
 | ||||
| This example is shown with Express, but any node app will do. Greenlock | ||||
| works with everything. | ||||
| (or any node-style http app) | ||||
| 
 | ||||
| `my-express-app.js`: | ||||
| 
 | ||||
| ```js | ||||
| "use strict"; | ||||
| 
 | ||||
| // A plain, node-style app | ||||
| 
 | ||||
| function myPlainNodeHttpApp(req, res) { | ||||
|     res.end("Hello, Encrypted World!"); | ||||
| } | ||||
| 
 | ||||
| // Wrap that plain app in express, | ||||
| // because that's what you're used to | ||||
| 
 | ||||
| var express = require("express"); | ||||
| var app = express(); | ||||
| app.get("/", myPlainNodeHttpApp); | ||||
| 
 | ||||
| // export the app normally | ||||
| // do not .listen() | ||||
| 
 | ||||
| module.exports = app; | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
| <summary>3. Serve with Greenlock Express</summary> | ||||
| 
 | ||||
| ## 3. Serve with Greenlock Express | ||||
| 
 | ||||
| Greenlock Express is designed with these goals in mind: | ||||
| 
 | ||||
| -   Simplicity and ease-of-use | ||||
| -   Performance and scalability | ||||
| -   Configurability and control | ||||
| 
 | ||||
| You can start with **near-zero configuration** and | ||||
| slowly add options for greater performance and customization | ||||
| later, if you need them. | ||||
| 
 | ||||
| `server.js`: | ||||
| 
 | ||||
| ```js | ||||
| "use strict"; | ||||
| 
 | ||||
| //var pkg = require("./package.json"); | ||||
| var app = require("./app.js"); | ||||
| 
 | ||||
| require("greenlock-express") | ||||
|     .init({ | ||||
|         // name & version for ACME client user agent | ||||
|         //packageAgent: pkg.name + "/" + pkg.version, | ||||
| 
 | ||||
|         // contact for security and critical bug notices | ||||
|         maintainerEmail: pkg.author, | ||||
| 
 | ||||
|         // where to find .greenlockrc and set default paths | ||||
|         packageRoot: __dirname, | ||||
| 
 | ||||
|         // where config and certificate stuff go | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         // whether or not to run at cloudscale | ||||
|         cluster: false | ||||
|     }) | ||||
|     .serve(app); | ||||
| ``` | ||||
| 
 | ||||
| And start your server: | ||||
| 
 | ||||
| ```bash | ||||
| # Allow non-root node to use ports 80 (HTTP) and 443 (HTTPS) | ||||
| sudo setcap 'cap_net_bind_service=+ep' $(which node) | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| # `npm start` will call `node ./server.js` by default | ||||
| npm start | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| # use --staging to use the development API until you're ready to get real certificates | ||||
| npm start -- --staging | ||||
| ``` | ||||
| 
 | ||||
| ```txt | ||||
| Greenlock v4.0.0 | ||||
| Greenlock Config Dir/File: ./greenlock.d/config.json | ||||
| 
 | ||||
| Listening on 0.0.0.0:80 for ACME challenges and HTTPS redirects | ||||
| Listening on 0.0.0.0:443 for secure traffic | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
| <summary>4. Manage SSL Certificates and Domains</summary> | ||||
| 
 | ||||
| ## 4. Manage domains | ||||
| 
 | ||||
| The management API is built to work with Databases, S3, etc. | ||||
| 
 | ||||
| By default, it's just a simple config file and directory. | ||||
| 
 | ||||
| ```bash | ||||
| # see which manager and what options are in use | ||||
| cat .greenlockrc | ||||
| ``` | ||||
| 
 | ||||
| <details> | ||||
| <summary>Example Output</summary> | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|     "manager": { | ||||
|         "module": "@greenlock/manager" | ||||
|     }, | ||||
|     "configDir": "./greenlock.d" | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ```bash | ||||
| # show the global defaults | ||||
| npx greenlock defaults | ||||
| ``` | ||||
| 
 | ||||
| ```js | ||||
| var defaults = await greenlock.defaults(); | ||||
| ``` | ||||
| 
 | ||||
| <details> | ||||
| <summary>Example Output</summary> | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|     "store": { | ||||
|         "module": "greenlock-store-fs", | ||||
|         "basePath": "./greenlock.d" | ||||
|     }, | ||||
|     "challenges": { | ||||
|         "http-01": { | ||||
|             "module": "acme-http-01-standalone" | ||||
|         } | ||||
|     }, | ||||
|     "renewOffset": "-45d", | ||||
|     "renewStagger": "3d", | ||||
|     "accountKeyType": "EC-P256", | ||||
|     "serverKeyType": "RSA-2048", | ||||
|     "subscriberEmail": "jon@example.com", | ||||
|     "agreeToTerms": true | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ```bash | ||||
| # show per-site configs | ||||
| npx greenlock config --subject example.com | ||||
| ``` | ||||
| 
 | ||||
| ```js | ||||
| greenlock.sites.get({ subject: "example.com" }); | ||||
| ``` | ||||
| 
 | ||||
| <details> | ||||
| <summary>Example Output</summary> | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|     "subject": "example.com", | ||||
|     "altnames": ["example.com"], | ||||
|     "renewAt": 1576638107754, | ||||
|     "defaults": { | ||||
|         "store": { | ||||
|             "module": "greenlock-store-fs", | ||||
|             "basePath": "./greenlock.d" | ||||
|         }, | ||||
|         "challenges": { | ||||
|             "http-01": { | ||||
|                 "module": "acme-http-01-standalone" | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| Management can be done via the **CLI** or the JavaScript [**API**](https://git.rootprojects.org/root/greenlock.js). | ||||
| Since this is the QuickStart, we'll demo the **CLI**: | ||||
| 
 | ||||
| You need to create a Let's Encrypt _subscriber account_, which can be done globally, or per-site. | ||||
| All individuals, and most businesses, should set this globally: | ||||
| 
 | ||||
| ```bash | ||||
| # Set a global subscriber account | ||||
| npx greenlock defaults --subscriber-email 'mycompany@example.com' --agree-to-terms true | ||||
| ``` | ||||
| 
 | ||||
| ```js | ||||
| greenlock.manager.defaults({ | ||||
|     subscriberEmail: "mycompany@example.com", | ||||
|     agreeToTerms: true | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| <!-- todo print where the key was saved --> | ||||
| 
 | ||||
| A Let's Encrypt SSL certificate has a "Subject" (Primary Domain) and up to 100 "Alternative Names" | ||||
| (of which the first _must_ be the subject). | ||||
| 
 | ||||
| ```bash | ||||
| # Add a certificate with specific domains | ||||
| npx greenlock add --subject example.com --altnames example.com,www.example.com | ||||
| ``` | ||||
| 
 | ||||
| ```js | ||||
| greenlock.sites.add({ | ||||
|     subject: "example.com", | ||||
|     altnames: ["example.com"] | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| <!-- todo print where the cert was saved --> | ||||
| 
 | ||||
| Note: **Localhost**, **Wildcard**, and Certificates for Private Networks require | ||||
| [**DNS validation**](https://git.rootprojects.org/root/greenlock-exp). | ||||
| 
 | ||||
| -   DNS Validation | ||||
|     -   [**Wildcards**](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples/wildcards/) (coming soon) | ||||
|     -   [**Localhost**](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples/localhost/) (coming soon) | ||||
|     -   [**CI/CD**](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples/ci-cd/) (coming soon) | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| # Plenty of Examples | ||||
| # Examples | ||||
| 
 | ||||
| -   [greenlock-express.js/examples/](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples) | ||||
|     -   [Express](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples/express/) | ||||
| @ -411,6 +197,22 @@ Note: **Localhost**, **Wildcard**, and Certificates for Private Networks require | ||||
|     -   [**CI/CD**](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples/ci-cd/) (coming soon) | ||||
|     -   [HTTP Proxy](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples/http-proxy/) | ||||
| 
 | ||||
| # Using a Database, S3, etc | ||||
| 
 | ||||
| If you have a small site, the default file storage will work well for you. | ||||
| 
 | ||||
| If you have many sites with many users, you'll probably want to store config in a database of some sort. | ||||
| 
 | ||||
| See the section on **Custom** callbacks and plugins below. | ||||
| 
 | ||||
| # Advanced Configuration | ||||
| 
 | ||||
| All of the advanced configuration is done by replacing the default behavior with callbacks. | ||||
| 
 | ||||
| You can whip up your own, or you can use something that's published to npm. | ||||
| 
 | ||||
| See the section on **Custom** callbacks and plugins below. | ||||
| 
 | ||||
| # Easy to Customize | ||||
| 
 | ||||
| <!-- greenlock-manager-test => greenlock-manager-custom --> | ||||
|  | ||||
							
								
								
									
										252
									
								
								WALKTHROUGH.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								WALKTHROUGH.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,252 @@ | ||||
| # Greenlock Express Walkthrough | ||||
| 
 | ||||
| This will show you the basics of how to | ||||
| 
 | ||||
| 1. Create a node project | ||||
| 2. Create an http app (i.e. express) | ||||
| 3. Serve with Greenlock Express | ||||
| 4. Manage SSL Certificates and Domains | ||||
| 
 | ||||
| ## 1. Create a node project | ||||
| 
 | ||||
| Create an empty node project. | ||||
| 
 | ||||
| Be sure to fill out the package name, version, and an author email. | ||||
| 
 | ||||
| ```bash | ||||
| mkdir ~/my-project | ||||
| pushd ~/my-project | ||||
| npm init | ||||
| ``` | ||||
| 
 | ||||
| ## 2. Create an http app (i.e. express) | ||||
| 
 | ||||
| This example is shown with Express, but any node app will do. Greenlock | ||||
| works with everything. | ||||
| (or any node-style http app) | ||||
| 
 | ||||
| `my-express-app.js`: | ||||
| 
 | ||||
| ```js | ||||
| "use strict"; | ||||
| 
 | ||||
| // A plain, node-style app | ||||
| 
 | ||||
| function myPlainNodeHttpApp(req, res) { | ||||
|     res.end("Hello, Encrypted World!"); | ||||
| } | ||||
| 
 | ||||
| // Wrap that plain app in express, | ||||
| // because that's what you're used to | ||||
| 
 | ||||
| var express = require("express"); | ||||
| var app = express(); | ||||
| app.get("/", myPlainNodeHttpApp); | ||||
| 
 | ||||
| // export the app normally | ||||
| // do not .listen() | ||||
| 
 | ||||
| module.exports = app; | ||||
| ``` | ||||
| 
 | ||||
| ## 3. Serve with Greenlock Express | ||||
| 
 | ||||
| Greenlock Express is designed with these goals in mind: | ||||
| 
 | ||||
| -   Simplicity and ease-of-use | ||||
| -   Performance and scalability | ||||
| -   Configurability and control | ||||
| 
 | ||||
| You can start with **near-zero configuration** and | ||||
| slowly add options for greater performance and customization | ||||
| later, if you need them. | ||||
| 
 | ||||
| `server.js`: | ||||
| 
 | ||||
| ```js | ||||
| "use strict"; | ||||
| 
 | ||||
| //var pkg = require("./package.json"); | ||||
| var app = require("./app.js"); | ||||
| 
 | ||||
| require("greenlock-express") | ||||
|     .init({ | ||||
|         // where to find .greenlockrc and set default paths | ||||
|         packageRoot: __dirname, | ||||
| 
 | ||||
|         // where config and certificate stuff go | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         // contact for security and critical bug notices | ||||
|         maintainerEmail: pkg.author, | ||||
| 
 | ||||
|         // name & version for ACME client user agent | ||||
|         //packageAgent: pkg.name + "/" + pkg.version, | ||||
| 
 | ||||
|         // whether or not to run at cloudscale | ||||
|         cluster: false | ||||
|     }) | ||||
|     .serve(app); | ||||
| ``` | ||||
| 
 | ||||
| And start your server: | ||||
| 
 | ||||
| ```bash | ||||
| # Allow non-root node to use ports 80 (HTTP) and 443 (HTTPS) | ||||
| sudo setcap 'cap_net_bind_service=+ep' $(which node) | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| # `npm start` will call `node ./server.js` by default | ||||
| npm start | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| # use --staging to use the development API until you're ready to get real certificates | ||||
| npm start -- --staging | ||||
| ``` | ||||
| 
 | ||||
| ```txt | ||||
| Greenlock v4.0.0 | ||||
| Greenlock Config Dir/File: ./greenlock.d/config.json | ||||
| 
 | ||||
| Listening on 0.0.0.0:80 for ACME challenges and HTTPS redirects | ||||
| Listening on 0.0.0.0:443 for secure traffic | ||||
| ``` | ||||
| 
 | ||||
| ## 4. Manage SSL Certificates and Domains | ||||
| 
 | ||||
| The management API is built to work with Databases, S3, etc. | ||||
| 
 | ||||
| By default, it's just a simple config file and directory. | ||||
| 
 | ||||
| ```bash | ||||
| # see which manager and what options are in use | ||||
| cat .greenlockrc | ||||
| ``` | ||||
| 
 | ||||
| <details> | ||||
| <summary>Example Output</summary> | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|     "manager": { | ||||
|         "module": "@greenlock/manager" | ||||
|     }, | ||||
|     "configDir": "./greenlock.d" | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ```bash | ||||
| # show the global defaults | ||||
| npx greenlock defaults | ||||
| ``` | ||||
| 
 | ||||
| ```js | ||||
| var defaults = await greenlock.defaults(); | ||||
| ``` | ||||
| 
 | ||||
| <details> | ||||
| <summary>Example Output</summary> | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|     "store": { | ||||
|         "module": "greenlock-store-fs", | ||||
|         "basePath": "./greenlock.d" | ||||
|     }, | ||||
|     "challenges": { | ||||
|         "http-01": { | ||||
|             "module": "acme-http-01-standalone" | ||||
|         } | ||||
|     }, | ||||
|     "renewOffset": "-45d", | ||||
|     "renewStagger": "3d", | ||||
|     "accountKeyType": "EC-P256", | ||||
|     "serverKeyType": "RSA-2048", | ||||
|     "subscriberEmail": "jon@example.com", | ||||
|     "agreeToTerms": true | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ```bash | ||||
| # show per-site configs | ||||
| npx greenlock config --subject example.com | ||||
| ``` | ||||
| 
 | ||||
| ```js | ||||
| greenlock.sites.get({ subject: "example.com" }); | ||||
| ``` | ||||
| 
 | ||||
| <details> | ||||
| <summary>Example Output</summary> | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|     "subject": "example.com", | ||||
|     "altnames": ["example.com"], | ||||
|     "renewAt": 1576638107754, | ||||
|     "defaults": { | ||||
|         "store": { | ||||
|             "module": "greenlock-store-fs", | ||||
|             "basePath": "./greenlock.d" | ||||
|         }, | ||||
|         "challenges": { | ||||
|             "http-01": { | ||||
|                 "module": "acme-http-01-standalone" | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| Management can be done via the **CLI** or the JavaScript [**API**](https://git.rootprojects.org/root/greenlock.js). | ||||
| Since this is the QuickStart, we'll demo the **CLI**: | ||||
| 
 | ||||
| You need to create a Let's Encrypt _subscriber account_, which can be done globally, or per-site. | ||||
| All individuals, and most businesses, should set this globally: | ||||
| 
 | ||||
| ```bash | ||||
| # Set a global subscriber account | ||||
| npx greenlock defaults --subscriber-email 'mycompany@example.com' --agree-to-terms true | ||||
| ``` | ||||
| 
 | ||||
| ```js | ||||
| greenlock.manager.defaults({ | ||||
|     subscriberEmail: "mycompany@example.com", | ||||
|     agreeToTerms: true | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| <!-- todo print where the key was saved --> | ||||
| 
 | ||||
| A Let's Encrypt SSL certificate has a "Subject" (Primary Domain) and up to 100 "Alternative Names" | ||||
| (of which the first _must_ be the subject). | ||||
| 
 | ||||
| ```bash | ||||
| # Add a certificate with specific domains | ||||
| npx greenlock add --subject example.com --altnames example.com,www.example.com | ||||
| ``` | ||||
| 
 | ||||
| ```js | ||||
| greenlock.sites.add({ | ||||
|     subject: "example.com", | ||||
|     altnames: ["example.com"] | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| <!-- todo print where the cert was saved --> | ||||
| 
 | ||||
| Note: **Localhost**, **Wildcard**, and Certificates for Private Networks require | ||||
| [**DNS validation**](https://git.rootprojects.org/root/greenlock-exp). | ||||
| 
 | ||||
| -   DNS Validation | ||||
|     -   [**Wildcards**](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples/wildcards/) (coming soon) | ||||
|     -   [**Localhost**](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples/localhost/) (coming soon) | ||||
|     -   [**CI/CD**](https://git.rootprojects.org/root/greenlock-express.js/src/branch/master/examples/ci-cd/) (coming soon) | ||||
							
								
								
									
										12
									
								
								examples/cluster/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/cluster/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| { | ||||
|   "name": "cluster-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "server.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "start": "node server.js" | ||||
|   }, | ||||
|   "author": "John Doe <j.doe@example.com> (https://example.com/)", | ||||
|   "license": "ISC" | ||||
| } | ||||
| @ -1,13 +1,11 @@ | ||||
| "use strict"; | ||||
| 
 | ||||
| var pkg = require("../../package.json"); | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
|     .init({ | ||||
|         packageRoot: __dirname, | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         return { | ||||
|             package: { name: "websocket-example", version: pkg.version }, | ||||
|         maintainerEmail: "jon@example.com", | ||||
| 
 | ||||
|         // When you're ready to go full cloud scale, you just change this to true:
 | ||||
| @ -17,9 +15,8 @@ require("../../") | ||||
|         // This will default to the number of workers being equal to
 | ||||
|         // n-1 cpus, with a minimum of 2
 | ||||
|         workers: 4 | ||||
|         }; | ||||
|     }) | ||||
|     .serve(httpsWorker); | ||||
|     .ready(httpsWorker); | ||||
| 
 | ||||
| function httpsWorker(glx) { | ||||
|     // WRONG
 | ||||
|  | ||||
							
								
								
									
										12
									
								
								examples/express/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/express/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| { | ||||
|   "name": "express-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "server.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "start": "node server.js" | ||||
|   }, | ||||
|   "author": "John Doe <j.doe@example.com> (https://example.com/)", | ||||
|   "license": "ISC" | ||||
| } | ||||
| @ -1,27 +1,22 @@ | ||||
| "use strict"; | ||||
| 
 | ||||
| function httpsWorker(glx) { | ||||
| var app = require("./my-express-app.js"); | ||||
| 
 | ||||
| app.get("/hello", function(req, res) { | ||||
|     res.end("Hello, Encrypted World!"); | ||||
| }); | ||||
| 
 | ||||
|     // Serves on 80 and 443
 | ||||
|     // Get's SSL certificates magically!
 | ||||
|     glx.serveApp(app); | ||||
| } | ||||
| 
 | ||||
| var pkg = require("../../package.json"); | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
|     .init({ | ||||
|         packageRoot: __dirname, | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         return { | ||||
|             package: { name: "http2-example", version: pkg.version }, | ||||
|         maintainerEmail: "jon@example.com", | ||||
| 
 | ||||
|         cluster: false | ||||
|         }; | ||||
|     }) | ||||
|     .serve(httpsWorker); | ||||
| 
 | ||||
|     // Serves on 80 and 443
 | ||||
|     // Get's SSL certificates magically!
 | ||||
|     .serve(app); | ||||
|  | ||||
							
								
								
									
										12
									
								
								examples/http-proxy/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/http-proxy/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| { | ||||
|   "name": "http-proxy-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "server.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "start": "node server.js" | ||||
|   }, | ||||
|   "author": "John Doe <j.doe@example.com> (https://example.com/)", | ||||
|   "license": "ISC" | ||||
| } | ||||
| @ -1,5 +1,21 @@ | ||||
| "use strict"; | ||||
| 
 | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
| 
 | ||||
|         return { | ||||
|             packageRoot: __dirname, | ||||
|             configDir: "./greenlock.d", | ||||
| 
 | ||||
|             maintainerEmail: "jon@example.com", | ||||
| 
 | ||||
|             cluster: false | ||||
|         }; | ||||
|     }) | ||||
|     .ready(httpsWorker); | ||||
| 
 | ||||
| function httpsWorker(glx) { | ||||
|     // we need the raw https server
 | ||||
|     var server = glx.httpsServer(); | ||||
| @ -28,17 +44,3 @@ function httpsWorker(glx) { | ||||
|         }); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| var pkg = require("../../package.json"); | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
| 
 | ||||
|         return { | ||||
|             package: { name: "http-proxy-example", version: pkg.version }, | ||||
|             maintainerEmail: "jon@example.com", | ||||
|             cluster: false | ||||
|         }; | ||||
|     }) | ||||
|     .serve(httpsWorker); | ||||
|  | ||||
							
								
								
									
										12
									
								
								examples/http/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/http/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| { | ||||
|   "name": "http-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "server.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "start": "node server.js" | ||||
|   }, | ||||
|   "author": "John Doe <j.doe@example.com> (https://example.com/)", | ||||
|   "license": "ISC" | ||||
| } | ||||
| @ -1,7 +1,5 @@ | ||||
| "use strict"; | ||||
| 
 | ||||
| var pkg = require("../../package.json"); | ||||
| 
 | ||||
| // The WRONG way:
 | ||||
| //var http = require('http');
 | ||||
| //var httpServer = https.createSecureServer(redirectToHttps);
 | ||||
| @ -10,6 +8,17 @@ var pkg = require("../../package.json"); | ||||
| // Greenlock needs to change some low-level http and https options.
 | ||||
| // Use glx.httpServer(redirectToHttps) instead.
 | ||||
| 
 | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init({ | ||||
|         packageRoot: __dirname, | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         maintainerEmail: "jon@example.com", | ||||
|         cluster: false | ||||
|     }) | ||||
|     .ready(httpsWorker); | ||||
| 
 | ||||
| function httpsWorker(glx) { | ||||
|     //
 | ||||
|     // HTTP can only be used for ACME HTTP-01 Challenges
 | ||||
| @ -27,16 +36,3 @@ function httpsWorker(glx) { | ||||
|         console.info("Listening on ", httpServer.address()); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
| 
 | ||||
|         return { | ||||
|             package: { name: "plain-http-example", version: pkg.version }, | ||||
|             maintainerEmail: "jon@example.com", | ||||
|             cluster: false | ||||
|         }; | ||||
|     }) | ||||
|     .serve(httpsWorker); | ||||
|  | ||||
							
								
								
									
										12
									
								
								examples/http2/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/http2/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| { | ||||
|   "name": "http2-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "server.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "start": "node server.js" | ||||
|   }, | ||||
|   "author": "John Doe <j.doe@example.com> (https://example.com/)", | ||||
|   "license": "ISC" | ||||
| } | ||||
| @ -1,7 +1,5 @@ | ||||
| "use strict"; | ||||
| 
 | ||||
| var pkg = require("../../package.json"); | ||||
| 
 | ||||
| // The WRONG way:
 | ||||
| //var http2 = require('http2');
 | ||||
| //var http2Server = https.createSecureServer(tlsOptions, app);
 | ||||
| @ -10,6 +8,17 @@ var pkg = require("../../package.json"); | ||||
| // Greenlock needs to change some low-level http and https options.
 | ||||
| // Use glx.httpsServer(tlsOptions, app) instead.
 | ||||
| 
 | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init({ | ||||
|         packageRoot: __dirname, | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         maintainerEmail: "jon@example.com", | ||||
|         cluster: false | ||||
|     }) | ||||
|     .ready(httpsWorker); | ||||
| 
 | ||||
| function httpsWorker(glx) { | ||||
|     //
 | ||||
|     // HTTP2 would have been the default httpsServer for node v12+
 | ||||
| @ -29,20 +38,8 @@ function httpsWorker(glx) { | ||||
|     // You must ALSO listen on port 80 for ACME HTTP-01 Challenges
 | ||||
|     // (the ACME and http->https middleware are loaded by glx.httpServer)
 | ||||
|     var httpServer = glx.httpServer(); | ||||
| 
 | ||||
|     httpServer.listen(80, "0.0.0.0", function() { | ||||
|         console.info("Listening on ", httpServer.address()); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
| 
 | ||||
|         return { | ||||
|             package: { name: "http2-example", version: pkg.version }, | ||||
|             maintainerEmail: "jon@example.com", | ||||
|             cluster: false | ||||
|         }; | ||||
|     }) | ||||
|     .serve(httpsWorker); | ||||
|  | ||||
							
								
								
									
										12
									
								
								examples/https/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/https/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| { | ||||
|   "name": "https1-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "server.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "start": "node server.js" | ||||
|   }, | ||||
|   "author": "John Doe <j.doe@example.com> (https://example.com/)", | ||||
|   "license": "ISC" | ||||
| } | ||||
| @ -1,7 +1,5 @@ | ||||
| "use strict"; | ||||
| 
 | ||||
| var pkg = require("../../package.json"); | ||||
| 
 | ||||
| // The WRONG way:
 | ||||
| //var https = require('https');
 | ||||
| //var httpsServer = https.createServer(tlsOptions, app);
 | ||||
| @ -10,6 +8,17 @@ var pkg = require("../../package.json"); | ||||
| // Greenlock needs to change some low-level http and https options.
 | ||||
| // Use glx.httpsServer(tlsOptions, app) instead.
 | ||||
| 
 | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init({ | ||||
|         packageRoot: __dirname, | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         maintainerEmail: "jon@example.com", | ||||
|         cluster: false | ||||
|     }) | ||||
|     .ready(httpsWorker); | ||||
| 
 | ||||
| function httpsWorker(glx) { | ||||
|     //
 | ||||
|     // HTTPS 1.1 is the default
 | ||||
| @ -29,20 +38,8 @@ function httpsWorker(glx) { | ||||
|     // You must ALSO listen on port 80 for ACME HTTP-01 Challenges
 | ||||
|     // (the ACME and http->https middleware are loaded by glx.httpServer)
 | ||||
|     var httpServer = glx.httpServer(); | ||||
| 
 | ||||
|     httpServer.listen(80, "0.0.0.0", function() { | ||||
|         console.info("Listening on ", httpServer.address()); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
| 
 | ||||
|         return { | ||||
|             package: { name: "https1-example", version: pkg.version }, | ||||
|             maintainerEmail: "jon@example.com", | ||||
|             cluster: false | ||||
|         }; | ||||
|     }) | ||||
|     .serve(httpsWorker); | ||||
|  | ||||
							
								
								
									
										12
									
								
								examples/quickstart/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/quickstart/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| { | ||||
|   "name": "quickstart-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "server.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "start": "node server.js" | ||||
|   }, | ||||
|   "author": "John Doe <j.doe@example.com> (https://example.com/)", | ||||
|   "license": "ISC" | ||||
| } | ||||
| @ -1,32 +1,27 @@ | ||||
| "use strict"; | ||||
| 
 | ||||
| function httpsWorker(glx) { | ||||
| // This can be a node http app (shown),
 | ||||
| // an Express app, or Hapi, Koa, Rill, etc
 | ||||
| var app = function(req, res) { | ||||
|     res.end("Hello, Encrypted World!"); | ||||
| }; | ||||
| 
 | ||||
|     // Serves on 80 and 443
 | ||||
|     // Get's SSL certificates magically!
 | ||||
|     glx.serveApp(app); | ||||
| } | ||||
| 
 | ||||
| var pkg = require("../../package.json"); | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
| 
 | ||||
|         return { | ||||
|             // Package name+version is used for ACME client user agent
 | ||||
|             package: { name: "websocket-example", version: pkg.version }, | ||||
|     .init({ | ||||
|         // Package name+version are taken from <packageRoot>/package.json and used for ACME client user agent
 | ||||
|         packageRoot: __dirname, | ||||
|         // configDir is relative to packageRoot, not _this_ file
 | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         // Maintainer email is the contact for critical bug and security notices
 | ||||
|             maintainerEmail: "jon@example.com", | ||||
|         // by default package.json.author.email will be used
 | ||||
|         //maintainerEmail: "jon@example.com",
 | ||||
| 
 | ||||
|         // Change to true when you're ready to make your app cloud-scale
 | ||||
|         cluster: false | ||||
|         }; | ||||
|     }) | ||||
|     .serve(httpsWorker); | ||||
| 
 | ||||
|     // Serves on 80 and 443
 | ||||
|     // Get's SSL certificates magically!
 | ||||
|     .serve(app); | ||||
|  | ||||
							
								
								
									
										12
									
								
								examples/socket.io/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/socket.io/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| { | ||||
|   "name": "socket-io-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "server.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "start": "node server.js" | ||||
|   }, | ||||
|   "author": "John Doe <j.doe@example.com> (https://example.com/)", | ||||
|   "license": "ISC" | ||||
| } | ||||
| @ -8,6 +8,17 @@ | ||||
| //       You can just use WebSockets
 | ||||
| //       (see the websocket example)
 | ||||
| 
 | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init({ | ||||
|         packageRoot: __dirname, | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         maintainerEmail: "jon@example.com", | ||||
|         cluster: false | ||||
|     }) | ||||
|     .ready(httpsWorker); | ||||
| 
 | ||||
| function httpsWorker(glx) { | ||||
|     var socketio = require("socket.io"); | ||||
|     var io; | ||||
| @ -33,17 +44,3 @@ function httpsWorker(glx) { | ||||
|         res.end("Hello, World!\n\n💚 🔒.js"); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| var pkg = require("../../package.json"); | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
| 
 | ||||
|         return { | ||||
|             package: { name: "socket-io-example", version: pkg.version }, | ||||
|             maintainerEmail: "jon@example.com", | ||||
|             cluster: false | ||||
|         }; | ||||
|     }) | ||||
|     .serve(httpsWorker); | ||||
|  | ||||
							
								
								
									
										12
									
								
								examples/websockets/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/websockets/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| { | ||||
|   "name": "websockets-example", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "server.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "start": "node server.js" | ||||
|   }, | ||||
|   "author": "John Doe <j.doe@example.com> (https://example.com/)", | ||||
|   "license": "ISC" | ||||
| } | ||||
| @ -1,5 +1,16 @@ | ||||
| "use strict"; | ||||
| 
 | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init({ | ||||
|         packageRoot: __dirname, | ||||
|         configDir: "./greenlock.d", | ||||
| 
 | ||||
|         maintainerEmail: "jon@example.com", | ||||
|         cluster: false | ||||
|     }) | ||||
|     .ready(httpsWorker); | ||||
| 
 | ||||
| function httpsWorker(glx) { | ||||
|     // we need the raw https server
 | ||||
|     var server = glx.httpsServer(); | ||||
| @ -26,17 +37,3 @@ function httpsWorker(glx) { | ||||
|         res.end("Hello, World!\n\n💚 🔒.js"); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| var pkg = require("../../package.json"); | ||||
| //require("greenlock-express")
 | ||||
| require("../../") | ||||
|     .init(function getConfig() { | ||||
|         // Greenlock Config
 | ||||
| 
 | ||||
|         return { | ||||
|             package: { name: "websocket-example", version: pkg.version }, | ||||
|             maintainerEmail: "jon@example.com", | ||||
|             cluster: false | ||||
|         }; | ||||
|     }) | ||||
|     .serve(httpsWorker); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user