Compare commits
No commits in common. "master" and "greenlock" have entirely different histories.
|
@ -2,11 +2,10 @@
|
||||||
ATTENTION!
|
ATTENTION!
|
||||||
==========
|
==========
|
||||||
|
|
||||||
Please report issues at https://git.coolaj86.com/coolaj86/greenlock-express.js
|
Please report issues at https://github.com/Daplie/letsencrypt-express
|
||||||
|
|
||||||
========
|
========
|
||||||
ACHTUNG!
|
ACHTUNG!
|
||||||
========
|
========
|
||||||
|
|
||||||
Bitte melden Sie Probleme bei
|
Bitte melden Sie Probleme bei https://github.com/Daplie/letsencrypt-express
|
||||||
https://git.coolaj86.com/coolaj86/greenlock-express.js
|
|
||||||
|
|
31
LICENSE
31
LICENSE
|
@ -1,32 +1,3 @@
|
||||||
At your option you may choose either of the following licenses:
|
|
||||||
|
|
||||||
* The MIT License (MIT)
|
|
||||||
* The Apache License 2.0 (Apache-2.0)
|
|
||||||
|
|
||||||
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2016-2018 AJ ONeal
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
|
|
||||||
Apache License
|
Apache License
|
||||||
Version 2.0, January 2004
|
Version 2.0, January 2004
|
||||||
http://www.apache.org/licenses/
|
http://www.apache.org/licenses/
|
||||||
|
@ -215,7 +186,7 @@ SOFTWARE.
|
||||||
same "printed page" as the copyright notice for easier
|
same "printed page" as the copyright notice for easier
|
||||||
identification within third-party archives.
|
identification within third-party archives.
|
||||||
|
|
||||||
Copyright 2015 AJ ONeal
|
Copyright {yyyy} {name of copyright owner}
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
149
README.md
149
README.md
|
@ -1,76 +1,94 @@
|
||||||
# Greenlock™ for hapi
|
<!-- BANNER_TPL_BEGIN -->
|
||||||
|
|
||||||
An Automated HTTPS ACME client (Let's Encrypt v2) for hapi
|
About Daplie: We're taking back the Internet!
|
||||||
|
--------------
|
||||||
|
|
||||||
| Sponsered by [ppl](https://ppl.family)
|
Down with Google, Apple, and Facebook!
|
||||||
| Greenlock™ is 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**,
|
|
||||||
[Koa](https://git.coolaj86.com/coolaj86/greenlock-koa.js),
|
|
||||||
and [rill](https://git.coolaj86.com/coolaj86/greenlock-rill.js) |
|
|
||||||
|
|
||||||
Features
|
We're re-decentralizing the web and making it read-write again - one home cloud system at a time.
|
||||||
========
|
|
||||||
|
|
||||||
* [x] Automatic Registration via SNI (`httpsOptions.SNICallback`)
|
Tired of serving the Empire? Come join the Rebel Alliance:
|
||||||
* [x] Secure domain approval callback
|
|
||||||
* [x] Automatic renewal between 10 and 14 days before expiration
|
|
||||||
* [x] Virtual Hosting (vhost) with Multiple Domains & SAN
|
|
||||||
* [x] plugins for AWS, redis, etc
|
|
||||||
* [x] and [more](https://git.coolaj86.com/coolaj86/greenlock-express.js)
|
|
||||||
|
|
||||||
This module is just an alias for greenlock-express.js,
|
<a href="mailto:jobs@daplie.com">jobs@daplie.com</a> | [Invest in Daplie on Wefunder](https://daplie.com/invest/) | [Pre-order Cloud](https://daplie.com/preorder/), The World's First Home Server for Everyone
|
||||||
which works with any middleware system.
|
|
||||||
|
|
||||||
Install
|
<!-- BANNER_TPL_END -->
|
||||||
=======
|
|
||||||
|
# greenlock-hapi (letsencrypt-hapi)
|
||||||
|
|
||||||
|
[![Join the chat at https://gitter.im/Daplie/letsencrypt-express](https://badges.gitter.im/Daplie/letsencrypt-express.svg)](https://gitter.im/Daplie/letsencrypt-express?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
|
||||||
|
| [greenlock (lib)](https://git.daplie.com/Daplie/node-greenlock)
|
||||||
|
| [greenlock-cli](https://git.daplie.com/Daplie/greenlock-cli)
|
||||||
|
| [greenlock-express](https://git.daplie.com/Daplie/greenlock-express)
|
||||||
|
| [greenlock-cluster](https://git.daplie.com/Daplie/greenlock-cluster)
|
||||||
|
| [greenlock-koa](https://git.daplie.com/Daplie/greenlock-koa)
|
||||||
|
| **greenlock-hapi**
|
||||||
|
|
|
||||||
|
|
||||||
|
Free SSL and Automatic HTTPS for node.js with hapi.js and other middleware systems via Let's Encrypt
|
||||||
|
|
||||||
|
* 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**
|
||||||
|
* Automatic vhost / virtual hosting
|
||||||
|
|
||||||
|
All you have to do is start the webserver and then visit it at it's domain name.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
```
|
```
|
||||||
npm install --save greenlock-hapi@2.x
|
npm install --save greenlock-express@2.x
|
||||||
```
|
```
|
||||||
|
|
||||||
QuickStart
|
*Pay no attention to the man behind the curtain.* (just ignore that the name of the module is greenlock-express)
|
||||||
==========
|
|
||||||
|
### Part 1: Configure Greenlock
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
//////////////////////
|
var le = require('greenlock-express').create({
|
||||||
// Greenlock Setup //
|
server: 'staging' // in production use https://acme-v01.api.letsencrypt.org/directory
|
||||||
//////////////////////
|
|
||||||
|
|
||||||
var greenlock = require('greenlock-hapi').create({
|
, configDir: require('os').homedir() + '/letsencrypt/etc'
|
||||||
version: 'draft-11' // Let's Encrypt v2
|
|
||||||
// You MUST change this to 'https://acme-v02.api.letsencrypt.org/directory' in production
|
|
||||||
, server: 'https://acme-staging-v02.api.letsencrypt.org/directory'
|
|
||||||
|
|
||||||
, email: 'jon@example.com'
|
, approveDomains: function (opts, certs, cb) {
|
||||||
, agreeTos: true
|
opts.domains = certs && certs.altnames || opts.domains;
|
||||||
, approveDomains: [ 'example.com' ]
|
opts.email = 'john.doe@example.com' // CHANGE ME
|
||||||
|
opts.agreeTos = true;
|
||||||
|
|
||||||
// Join the community to get notified of important updates
|
cb(null, { options: opts, certs: certs });
|
||||||
// and help make greenlock better
|
}
|
||||||
, communityMember: true
|
|
||||||
|
|
||||||
, configDir: require('os').homedir() + '/acme/etc'
|
, debug: true
|
||||||
|
|
||||||
//, debug: true
|
|
||||||
});
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
WARNING: If you don't do any checks and simply complete `approveDomains` 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.
|
||||||
|
Alternatively, You can run registration *manually*:
|
||||||
|
|
||||||
///////////////////
|
```bash
|
||||||
// Just add hapi //
|
npm install -g greenlock-cli
|
||||||
///////////////////
|
|
||||||
|
|
||||||
|
greenlock certonly --standalone \
|
||||||
|
--server 'https://acme-v01.api.letsencrypt.org/directory' \
|
||||||
|
--config-dir ~/letsencrypt/etc \
|
||||||
|
--agree-tos --domains example.com --email user@example.com
|
||||||
|
|
||||||
|
# Note: the '--webrootPath' option is also available if you don't want to shut down your webserver to get the cert.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Part 2: Just add Hapi
|
||||||
|
|
||||||
|
```javascript
|
||||||
var hapi = require('hapi');
|
var hapi = require('hapi');
|
||||||
var https = require('https');
|
var https = require('spdy');
|
||||||
var server = new hapi.Server();
|
var server = new hapi.Server();
|
||||||
var acmeResponder = greenlock.middleware();
|
var acmeResponder = le.middleware();
|
||||||
var httpsServer = https.createServer(greenlock.httpsOptions).listen(443);
|
var httpsServer = https.createServer(le.httpsOptions).listen(443);
|
||||||
|
|
||||||
server.connection({ listener: httpsServer, autoListen: false, tls: true });
|
server.connection({ listener: httpsServer, autoListen: false, tls: true });
|
||||||
|
|
||||||
|
@ -93,38 +111,15 @@ server.route({
|
||||||
reply("Hello, I'm so Hapi!");
|
reply("Hello, I'm so Hapi!");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Part 3: Redirect http to https
|
||||||
|
|
||||||
//
|
```javascript
|
||||||
// http redirect to https
|
|
||||||
//
|
|
||||||
var http = require('http');
|
var http = require('http');
|
||||||
var redirectHttps = require('redirect-https')();
|
var redirectHttps = require('redirect-https')();
|
||||||
|
|
||||||
http.createServer(greenlock.middleware(redirectHttps)).listen(80, function () {
|
http.createServer(le.middleware(redirectHttps)).listen(80, function () {
|
||||||
console.log('Listening on port 80 to handle ACME http-01 challenge and redirect to https');
|
console.log('handle ACME http-01 challenge and redirect to https');
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
Usage & Troubleshooting
|
|
||||||
============================
|
|
||||||
|
|
||||||
See <https://git.coolaj86.com/coolaj86/greenlock-express.js>
|
|
||||||
|
|
||||||
Handling a dynamic list of domains
|
|
||||||
========================
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
**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.
|
|
||||||
|
|
||||||
We have a
|
|
||||||
[vhost example](https://git.coolaj86.com/coolaj86/greenlock-express.js/src/branch/master/examples/vhost.js)
|
|
||||||
that allows any domain for which there is a folder on the filesystem in a specific location.
|
|
||||||
|
|
||||||
See that example for an idea of how this is done.
|
|
||||||
|
|
5
index.js
5
index.js
|
@ -1,8 +1,3 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
module.exports = require('greenlock-express');
|
module.exports = require('greenlock-express');
|
||||||
module.exports._greenlockExpressCreate = module.exports.create;
|
|
||||||
module.create = function (opts) {
|
|
||||||
opts._communityPackage = opts._communityPackage || 'greenlock-hapi';
|
|
||||||
return module.exports._greenlockExpressCreate(opts);
|
|
||||||
};
|
|
||||||
|
|
15
package.json
15
package.json
|
@ -1,33 +1,32 @@
|
||||||
{
|
{
|
||||||
"name": "greenlock-hapi",
|
"name": "greenlock-hapi",
|
||||||
"homepage": "https://git.coolaj86.com/coolaj86/greenlock-hapi.js",
|
"version": "2.0.1",
|
||||||
"version": "2.1.3",
|
"description": "Free SSL and Automatic HTTPS for node.js with hapi and other middleware systems via ACME (Let's Encrypt)",
|
||||||
"description": "An Automated HTTPS ACME client (Let's Encrypt v2) for hapi",
|
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://git.coolaj86.com/coolaj86/greenlock-hapi.js.git"
|
"url": "git@git.daplie.com:Daplie/greenlock-hapi.git"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
"hapi",
|
||||||
"acme",
|
"acme",
|
||||||
"cloud",
|
"cloud",
|
||||||
"cluster",
|
"cluster",
|
||||||
"free",
|
"free",
|
||||||
"greenlock",
|
"greenlock",
|
||||||
"freessl",
|
|
||||||
"free ssl",
|
|
||||||
"https",
|
"https",
|
||||||
"hapi",
|
|
||||||
"le",
|
"le",
|
||||||
"letsencrypt",
|
"letsencrypt",
|
||||||
|
"multi-core",
|
||||||
"node",
|
"node",
|
||||||
"node.js",
|
"node.js",
|
||||||
|
"scale",
|
||||||
"ssl",
|
"ssl",
|
||||||
"tls"
|
"tls"
|
||||||
],
|
],
|
||||||
"author": "AJ ONeal <coolaj86@gmail.com> (https://coolaj86.com/)",
|
"author": "AJ ONeal <aj@daplie.com> (https://daplie.com/)",
|
||||||
"license": "(MIT OR Apache-2.0)"
|
"license": "(MIT OR Apache-2.0)"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue