This was useful for some time but I now use docker swarm with traefik for loadbalancing which has support for letsencrypt baked in. I suggest you start using this today too.
Bugs go to issues please.
Available on docker hub.
This service can be run on a webserver to obtain letsencrypt certificates. It can be run on the server that the A record of the domain points to, but the major benefit of this service is, that it can be run in a professional setup with loadbalancers and in this scenario be deployed on any node behind the loadbalancer without interrupting the live deployment.
This service has been tested in a deployment orchestrated with Docker Cloud and their haproxy image but should work fine in other setups too.
The problem with the default letsencrypt tool is that it expects to be run on port 80 on the root domain.
Or at least the server where all http traffic to the domain example.com
ends up. This
means that you can either "inject" it into your one instance apache or nginx server. If you have another setup
which involves for example some node http servers and path based http routing + loadbalancing you need to take down
your live deployment, start a new webserver, get the certificates on port 80 and then start your deployment
again. It goes without saying that this cannot be a "workflow".
To provide a solution to the above problem, we suggest this service.
I made a stackfile to get you going. Available on stackfiles.io
example.org
and have certs.example.org
and example.org
properly registered and
the DNS entries resolve to the node with the tag "loadbalancer"1.http://example.org/.well-known/check
shows the correct success message ("Letsencrypt cert service reporting in! Load balancing seems to work.")http://certs.example.org/.well-known/check
shows the correct success message ("Letsencrypt cert service reporting in! Load balancing seems to work.")http://certs.example.org/status
shows success messagehttp://certs.example.com/makecert
2(wait a little, if you get an error, check the server logs to debug or open an issue here).https://certs.example.org:8443/status
and authenticate (Please check that it is properly encrypted traffic!)https://certs.example.com:8443/certs/example.org/cert.pem
https://certs.example.com:8443/certs/example.org/privkey.pem
https://certs.example.com:8443/certs/example.org/bundle.pem?haproxy=true
(:D)https://example.org
gives you correctly encrypted responses.1: Two ways to achieve this. For example.org
(root domain) you need an A-Record with the ip address of the node. Do not set a CNAME for the root domain, you will break stuff, for example MX records.
For certs.example.org
you can either put an A record with the ip address or you create a CNAME for certs
and point it to the endpoint of the loadbalancer which will be something like lb.stackname.hashystring.dockercloud.com
2: There are no checks on rate limit and so on. Please do not hit /makecert
too often.
With private service enabled and certificates in place you can hit https://certs.example.org/makecert
to renew certs. On success you can retrieve the new extended certificate as above.
As this is a docker container image, all configuration of the running container is done by setting appropriate environment variables. These are as follows:
Variable | Explanation | Example value |
---|---|---|
CERT_DOMAINS | Domains the certificate should be issued for, comma separated | example.com,app.example.com |
CERT_EMAIL | Email for notifications (like imminent certificate expiry) | admin@example.com |
CERT_SERVICE_PRIVATE | Flag to run private part of app (certificate hosting) | true |
CERT_SERVICE_PASSWORD | Pass to authenticate against private certificate service | SomeGoodPassword |
CERT_SERVICE_USERNAME | Username to authenticate against private certificate service | michael |
Variable | Explanation | Example value |
---|---|---|
VIRTUAL_HOST | Routing all acme queries to the service | http://*/.well-known/* |
VIRTUAL_HOST_WEIGHT | Taking over example.org/.well-known/acme... queries. You need to set a value that is higher than the one of the "catch all" service|1 |
|
EXCLUDE_PORTS | Don't route traffic to port 443 | 443 |
Usually you would want the newly generated certificates to be stored in the hosts file system
so make sure to link the container dir /etc/letsencrypt
to the host.
The docker image is running a node service. It can also be used standalone if you need it. Documentation comes below.
Example
var CertService = require("letsencrypt-cert-service");
var certService = new CertService(config);
certService.start(callback);
Kind: inner class of letsencrypt-cert-service
Param | Type | Description |
---|---|---|
config | ||
config.domains | Array.<string> |
The hostnames which the certificate is to be created for |
config.email | string |
Letsencrypt notification email |
[config.private] | boolean |
Set to true when you want private service to be running |
[config.password] | string |
Strong password to protect private parts - required when private true |
[config.username] | string |
Username of choice - required when private true |
Before you open a pull request, please acknowledge the Unlicense. You have to sign a CLA before I can merge any PRs. For further details see the contribution guidelines.
Released under the Unlicense. See the Unlicense