]> git.street.me.uk Git - andy/dehydrated.git/blame_incremental - README.md
Merge pull request #143 from rumpelsepp/master
[andy/dehydrated.git] / README.md
... / ...
CommitLineData
1# letsencrypt.sh [![Build Status](https://travis-ci.org/lukas2511/letsencrypt.sh.svg?branch=master)](https://travis-ci.org/lukas2511/letsencrypt.sh)
2
3This is a client for signing certificates with an ACME-server (currently only provided by letsencrypt) implemented as a relatively simple bash-script.
4
5It uses the `openssl` utility for everything related to actually handling keys and certificates, so you need to have that installed.
6
7Other dependencies are: curl, sed, grep, mktemp (all found on almost any system, curl being the only exception)
8
9Current features:
10- Signing of a list of domains
11- Signing of a CSR
12- Renewal if a certificate is about to expire or SAN (subdomains) changed
13- Certificate revocation
14
15If you want to import existing keys from the official letsencrypt client have a look at [Import from official letsencrypt client](https://github.com/lukas2511/letsencrypt.sh/wiki/Import-from-official-letsencrypt-client).
16
17**Please note that you should use the staging URL when testing so as not to hit rate limits.** See the [Staging](#staging) section, below.
18
19Please keep in mind that this software and even the acme-protocol are relatively young and may still have some unresolved issues.
20Feel free to report any issues you find with this script or contribute by submitting a pullrequest.
21
22## Usage:
23
24```text
25Usage: ./letsencrypt.sh [-h] [command [argument]] [parameter [argument]] [parameter [argument]] ...
26
27Default command: help
28
29Commands:
30 --cron (-c) Sign/renew non-existant/changed/expiring certificates.
31 --signcsr (-s) path/to/csr.pem Sign a given CSR, output CRT on stdout (advanced usage)
32 --revoke (-r) path/to/cert.pem Revoke specified certificate
33 --cleanup (-gc) Move unused certificate files to archive directory
34 --help (-h) Show help text
35 --env (-e) Output configuration variables for use in other scripts
36
37Parameters:
38 --domain (-d) domain.tld Use specified domain name(s) instead of domains.txt entry (one certificate!)
39 --force (-x) Force renew of certificate even if it is longer valid than value in RENEW_DAYS
40 --privkey (-p) path/to/key.pem Use specified private key instead of account key (useful for revocation)
41 --config (-f) path/to/config.sh Use specified config file
42 --hook (-k) path/to/hook.sh Use specified script for hooks
43 --challenge (-t) http-01|dns-01 Which challenge should be used? Currently http-01 and dns-01 are supported
44 --algo (-a) rsa|prime256v1|secp384r1 Which public key algorithm should be used? Supported: rsa, prime256v1 and secp384r1
45```
46
47### domains.txt
48
49The file `domains.txt` should have the following format:
50
51```text
52example.com www.example.com
53example.net www.example.net wiki.example.net
54```
55
56This states that there should be two certificates `example.com` and `example.net`,
57with the other domains in the corresponding line being their alternative names.
58
59### $WELLKNOWN / challenge-response
60
61Boulder (acme-server) is looking for challenge responses under your domain in the `.well-known/acme-challenge` directory
62
63This script uses `http-01`-type verification (for now) so you need to have that directory available over normal http (no ssl).
64
65A full URL would look like `http://example.org/.well-known/acme-challenge/c3VjaC1jaGFsbGVuZ2UtbXVjaA-aW52YWxpZC13b3c`.
66
67An example setup to get this to work would be:
68
69nginx.conf:
70```
71...
72location /.well-known/acme-challenge {
73 alias /var/www/letsencrypt;
74}
75...
76```
77
78config.sh:
79```bash
80...
81WELLKNOWN="/var/www/letsencrypt"
82...
83```
84
85An alternative to setting the WELLKNOWN variable would be to create a symlink to the default location next to the script (or BASEDIR):
86`ln -s /var/www/letsencrypt .acme-challenges`
87
88### Staging
89
90Let’s Encrypt has stringent rate limits in place during the public beta period. If you start testing using the production endpoint (which is the default), you will quickly hit these limits and find yourself locked out. To avoid this, please set the CA property to the Let’s Encrypt staging server URL in your `config.sh` file:
91
92```bash
93CA="https://acme-staging.api.letsencrypt.org/directory"
94```
95
96### dns-01 challenge
97
98This script also supports the new `dns-01`-type verification. This type of verification requires you to be able to create a specific `TXT` DNS record for each hostname included in the certificate.
99
100You need a hook script that deploys the challenge to your DNS server!
101
102The hook script (indicated in the config.sh file or the --hook/-k command line argument) gets four arguments: an operation name (clean_challenge, deploy_challenge, or deploy_cert) and some operands for that. For deploy_challenge $2 is the domain name for which the certificate is required, $3 is a "challenge token" (which is not needed for dns-01), and $4 is a token which needs to be inserted in a TXT record for the domain.
103
104Typically, you will need to split the subdomain name in two, the subdomain name and the domain name separately. For example, for "my.example.com", you'll need "my" and "example.com" separately. You then have to prefix "_acme-challenge." before the subdomain name, as in "_acme-challenge.my" and set a TXT record for that on the domain (e.g. "example.com") which has the value supplied in $4
105
106That could be done manually (as most providers don't have a DNS API), by having your hook script echo $1, $2 and $4 and then wait (read -s -r -e < /dev/tty) - give it a little time to get into their DNS system. Usually providers give you a boxes to put "_acme-challenge.my" and the token value in, and a dropdown to choose the record type, TXT.
107
108Or when you do have a DNS API, pass the details accordingly to achieve the same thing.
109
110You can delete the TXT record when called with operation clean_challenge, when $2 is also the domain name.
111
112Here are some examples: [Examples for DNS-01 hooks](https://github.com/lukas2511/letsencrypt.sh/wiki/Examples-for-DNS-01-hooks)
113
114### Elliptic Curve Cryptography (ECC)
115
116This script also supports certificates with Elliptic Curve public keys! Be aware that at the moment this is not available on the production servers from letsencrypt. Please read https://community.letsencrypt.org/t/ecdsa-testing-on-staging/8809/ for the current state of ECC support.