| 
									
										
										
										
											2019-04-06 01:43:39 -06:00
										 |  |  | # [le-challenge-manual](https://git.coolaj86.com/coolaj86/le-challenge-manual.js)
 | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-06 00:19:12 -06:00
										 |  |  | | A [Root](https://rootprojects.org) Project | | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-06 00:19:12 -06:00
										 |  |  | An extremely simple reference implementation | 
					
						
							|  |  |  | of an ACME (Let's Encrypt) challenge strategy | 
					
						
							|  |  |  | for [Greenlock](https://git.coolaj86.com/coolaj86/greenlock-express.js) v2.7+ (and v3). | 
					
						
							| 
									
										
										
										
											2019-04-05 19:02:11 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-06 01:43:39 -06:00
										 |  |  | * Prints the ACME challenge details to the terminal | 
					
						
							|  |  |  |   * (waits for you to hit enter before continuing) | 
					
						
							|  |  |  | * Asks you to enter the challenge response. | 
					
						
							|  |  |  | * Let's you know it's safe to remove the challenge. | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-06 00:19:12 -06:00
										 |  |  | Other ACME Challenge Reference Implementations: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-06 01:43:39 -06:00
										 |  |  | * [**le-challenge-manual**](https://git.coolaj86.com/coolaj86/le-challenge-manual.js) | 
					
						
							|  |  |  | * [le-challenge-http](https://git.coolaj86.com/coolaj86/le-challenge-http.js) | 
					
						
							|  |  |  | * [le-challenge-dns](https://git.coolaj86.com/coolaj86/le-challenge-dns.js) | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | Install | 
					
						
							|  |  |  | ------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							| 
									
										
										
										
											2019-04-05 23:11:00 -06:00
										 |  |  | npm install --save le-challenge-manual@3.x | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Usage | 
					
						
							|  |  |  | ----- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							| 
									
										
										
										
											2019-04-05 23:11:00 -06:00
										 |  |  | var Greenlock = require('greenlock'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Greenlock.create({ | 
					
						
							|  |  |  |   ... | 
					
						
							|  |  |  | , challenges: { 'http-01': require('le-challenge-manual') | 
					
						
							|  |  |  |               , 'dns-01': require('le-challenge-manual') | 
					
						
							|  |  |  |               , 'tls-alpn-01': require('le-challenge-manual') | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |   ... | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | }); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-05 23:11:00 -06:00
										 |  |  | Note: If you request a certificate with 6 domains listed, | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | it will require 6 individual challenges. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-05 23:11:00 -06:00
										 |  |  | Exposed (Promise) Methods | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | --------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For ACME Challenge: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-05 23:11:00 -06:00
										 |  |  | * `set(opts)` | 
					
						
							|  |  |  | * `remove(opts)` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The options will look like this for normal domains: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | { challenge: { | 
					
						
							|  |  |  |     type: 'http-01' | 
					
						
							|  |  |  |   , identifier: { type: 'dns', value: 'example.com' } | 
					
						
							|  |  |  |   , wildcard: false | 
					
						
							|  |  |  |   , expires: '2012-01-01T12:00:00.000Z' | 
					
						
							|  |  |  |   , token: 'abc123' | 
					
						
							|  |  |  |   , thumbprint: '<<account key thumbprint>>' | 
					
						
							|  |  |  |   , keyAuthorization: 'abc123.xxxx' | 
					
						
							|  |  |  |   , dnsHost: '_acme-challenge.example.com' | 
					
						
							|  |  |  |   , dnsAuthorization: 'yyyy' | 
					
						
							|  |  |  |   , altname: 'example.com' | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | And they'll look like this for wildcard domains: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | { challenge: { | 
					
						
							|  |  |  |     type: 'http-01' | 
					
						
							|  |  |  |   , identifier: { type: 'dns', value: 'example.com' } | 
					
						
							|  |  |  |   , wildcard: true | 
					
						
							|  |  |  |   , expires: '2012-01-01T12:00:00.000Z' | 
					
						
							|  |  |  |   , token: 'abc123' | 
					
						
							|  |  |  |   , thumbprint: '<<account key thumbprint>>' | 
					
						
							|  |  |  |   , keyAuthorization: 'abc123.xxxx' | 
					
						
							|  |  |  |   , dnsHost: '_acme-challenge.example.com' | 
					
						
							|  |  |  |   , dnsAuthorization: 'yyyy' | 
					
						
							|  |  |  |   , altname: '*.example.com' | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The only difference is that `altname` will have the `*.` prefix (which you would expect | 
					
						
							|  |  |  | but, of course, can't work as a specific a DNS record) and the `wildcard` property is `true`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Optional | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `get(limitedOpts)` | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-05 23:11:00 -06:00
										 |  |  | Because the get method is apart from the main flow (such as a DNS query), | 
					
						
							|  |  |  | it's not always implemented and the options are much more limited in scope: | 
					
						
							| 
									
										
										
										
											2016-08-09 23:20:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-05 23:11:00 -06:00
										 |  |  | ```js | 
					
						
							|  |  |  | { challenge: { | 
					
						
							|  |  |  |     type: 'http-01' | 
					
						
							|  |  |  |   , identifier: { type: 'dns', value: 'example.com' } | 
					
						
							|  |  |  |   , wildcard: false | 
					
						
							|  |  |  |   , token: 'abc123' | 
					
						
							|  |  |  |   , altname: 'example.com' | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If there were an implementation of Greenlock integrated directly into | 
					
						
							|  |  |  | a NameServer (which currently there is not), it would probably look like this: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | { challenge: { | 
					
						
							|  |  |  |     type: 'dns-01' | 
					
						
							|  |  |  |   , identifier: { type: 'dns', value: 'example.com' } | 
					
						
							|  |  |  |   , token: 'abc123' | 
					
						
							|  |  |  |   , dnsHost: '_acme-challenge.example.com' | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` |