mirror of
https://github.com/dehydrated-io/dehydrated.git
synced 2026-03-13 05:35:16 +01:00
Compare commits
106 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6fb8eba56a | ||
|
|
19c7fbbf47 | ||
|
|
7128e6b63c | ||
|
|
861f4c733d | ||
|
|
ad3f08084c | ||
|
|
784fb806c8 | ||
|
|
b2574b16d1 | ||
|
|
da641588ce | ||
|
|
8e6ddf6286 | ||
|
|
8e5977890a | ||
|
|
3bcf0c7f5a | ||
|
|
b347bc9086 | ||
|
|
08477170e9 | ||
|
|
f4cf92bae5 | ||
|
|
93573cda3c | ||
|
|
607a6088d3 | ||
|
|
880c99aa63 | ||
|
|
7ac25358ef | ||
|
|
5733863b93 | ||
|
|
f6a84a88fa | ||
|
|
e963438c5a | ||
|
|
095165ee96 | ||
|
|
199cd59774 | ||
|
|
e17456778f | ||
|
|
71f6bc617e | ||
|
|
6ee4ae508e | ||
|
|
91cccc0c23 | ||
|
|
ab016803dd | ||
|
|
7d8573af12 | ||
|
|
fb06530097 | ||
|
|
5c1551e946 | ||
|
|
20c27b291c | ||
|
|
24f66a3473 | ||
|
|
21bff55b7c | ||
|
|
374fce0249 | ||
|
|
00941472b2 | ||
|
|
527933db24 | ||
|
|
33a421f1e4 | ||
|
|
dd0bbd2405 | ||
|
|
26660e11c7 | ||
|
|
316054ad1c | ||
|
|
29b67962ac | ||
|
|
3a7795589b | ||
|
|
082da2527c | ||
|
|
e784ba3853 | ||
|
|
abd369d062 | ||
|
|
cb7fb82beb | ||
|
|
174616becd | ||
|
|
27fd41d75f | ||
|
|
ea106ef72e | ||
|
|
f2d6a6152e | ||
|
|
129ec851ed | ||
|
|
835963fa6e | ||
|
|
829aaeff2d | ||
|
|
481aba7d7b | ||
|
|
fbcaac89f9 | ||
|
|
589e9f30b3 | ||
|
|
f2103340f3 | ||
|
|
c670c18299 | ||
|
|
7cc9e2d07f | ||
|
|
7dfde364a3 | ||
|
|
7d3288f428 | ||
|
|
e69df6521b | ||
|
|
8ddead4854 | ||
|
|
308b3ec750 | ||
|
|
39e1068a87 | ||
|
|
6d9fcd2588 | ||
|
|
60cb678e3b | ||
|
|
5f8cfa50ba | ||
|
|
b3abc41dbe | ||
|
|
b3b2fee496 | ||
|
|
416fd0fd1b | ||
|
|
142c69dd90 | ||
|
|
74c136905b | ||
|
|
5fc1175aef | ||
|
|
4b91fcf498 | ||
|
|
11323d0727 | ||
|
|
a9a64c9fd0 | ||
|
|
42a0fc9a5e | ||
|
|
e119d9136b | ||
|
|
275fb40ab4 | ||
|
|
7e92850957 | ||
|
|
bb5a1473d1 | ||
|
|
7f970b527c | ||
|
|
dc552c602e | ||
|
|
9827a411b3 | ||
|
|
4a55f93896 | ||
|
|
a07c8d14f6 | ||
|
|
42047fdf11 | ||
|
|
76d7e31981 | ||
|
|
4fd4d4d3c2 | ||
|
|
229f7186a6 | ||
|
|
4b7a1e4ce6 | ||
|
|
871efe653b | ||
|
|
dbb0ef1ce1 | ||
|
|
fcfb077a95 | ||
|
|
bc9344392a | ||
|
|
5b7c898b63 | ||
|
|
58bd926e30 | ||
|
|
c8333f5a56 | ||
|
|
307eaadddf | ||
|
|
dfffb1b88b | ||
|
|
e2eeaf7ec6 | ||
|
|
946e5712ba | ||
|
|
018254974c | ||
|
|
f60f2f81e8 |
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
github: lukas2511
|
||||||
|
custom: ["https://paypal.me/lukas2511", "http://www.amazon.de/registry/wishlist/1TUCFJK35IO4Q"]
|
||||||
35
CHANGELOG
35
CHANGELOG
@@ -1,6 +1,41 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
This file contains a log of major changes in dehydrated
|
This file contains a log of major changes in dehydrated
|
||||||
|
|
||||||
|
## [x.x.x] - xxxx-xx-xx
|
||||||
|
## Changed
|
||||||
|
- `--force` no longer forces domain name revalidation by default, a new argument `--force-validation` has been added for that
|
||||||
|
- Added support for EC secp521r1 algorithm (works with e.g. zerossl)
|
||||||
|
- `EC PARAMETERS` are no longer written to privkey.pem (didn't seem necessary and was causing issues with various software)
|
||||||
|
|
||||||
|
## Added
|
||||||
|
- Implemented EC for account keys
|
||||||
|
- Domain list now also read from domains.txt.d subdirectory (behaviour might change, see docs)
|
||||||
|
- Implemented RFC 8738 (validating/signing certificates for IP addresses instead of domain names) support (this will not work with most public CAs, if any!)
|
||||||
|
|
||||||
|
## [0.7.0] - 2020-12-10
|
||||||
|
## Added
|
||||||
|
- Support for external account bindings
|
||||||
|
- Special support for ZeroSSL
|
||||||
|
- Support presets for some CAs instead of requiring URLs
|
||||||
|
- Allow requesting preferred chain (`--preferred-chain`)
|
||||||
|
- Added method to show CAs current terms of service (`--display-terms`)
|
||||||
|
- Allow setting path to domains.txt using cli arguments (`--domains-txt`)
|
||||||
|
- Added new cli command `--cleanupdelete` which deletes old files instead of archiving them
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
- No more silent failures on broken hook-scripts
|
||||||
|
- Better error-handling with KEEP_GOING enabled
|
||||||
|
- Check actual order status instead of assuming it's valid
|
||||||
|
- Don't include keyAuthorization in challenge validation (RFC compliance)
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
- Using EC secp384r1 as default certificate type
|
||||||
|
- Use JSON.sh to parse JSON
|
||||||
|
- Use account URL instead of account ID (RFC compliance)
|
||||||
|
- Dehydrated now has a new home: https://github.com/dehydrated-io/dehydrated
|
||||||
|
- Added `OCSP_FETCH` and `OCSP_DAYS` to per-certificate configurable options
|
||||||
|
- Cleanup now also removes dangling symlinks
|
||||||
|
|
||||||
## [0.6.5] - 2019-06-26
|
## [0.6.5] - 2019-06-26
|
||||||
## Fixed
|
## Fixed
|
||||||
- Fixed broken APIv1 compatibility from last update
|
- Fixed broken APIv1 compatibility from last update
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2015-2018 Lukas Schauer
|
Copyright (c) 2015-2021 Lukas Schauer
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
34
README.md
34
README.md
@@ -1,6 +1,6 @@
|
|||||||
# dehydrated [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=23P9DSJBTY7C8)
|
# dehydrated [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=23P9DSJBTY7C8)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Dehydrated is a client for signing certificates with an ACME-server (e.g. Let's Encrypt) implemented as a relatively simple (zsh-compatible) bash-script.
|
Dehydrated is a client for signing certificates with an ACME-server (e.g. Let's Encrypt) implemented as a relatively simple (zsh-compatible) bash-script.
|
||||||
This client supports both ACME v1 and the new ACME v2 including support for wildcard certificates!
|
This client supports both ACME v1 and the new ACME v2 including support for wildcard certificates!
|
||||||
@@ -14,6 +14,7 @@ Current features:
|
|||||||
- Signing of a custom CSR (either standalone or completely automated using hooks!)
|
- Signing of a custom CSR (either standalone or completely automated using hooks!)
|
||||||
- Renewal if a certificate is about to expire or defined set of domains changed
|
- Renewal if a certificate is about to expire or defined set of domains changed
|
||||||
- Certificate revocation
|
- Certificate revocation
|
||||||
|
- and lots more..
|
||||||
|
|
||||||
Please keep in mind that this software, the ACME-protocol and all supported CA servers out there are relatively young and there might be a few issues. Feel free to report any issues you find with this script or contribute by submitting a pull request,
|
Please keep in mind that this software, the ACME-protocol and all supported CA servers out there are relatively young and there might be a few issues. Feel free to report any issues you find with this script or contribute by submitting a pull request,
|
||||||
but please check for duplicates first (feel free to comment on those to get things rolling).
|
but please check for duplicates first (feel free to comment on those to get things rolling).
|
||||||
@@ -49,12 +50,15 @@ Default command: help
|
|||||||
|
|
||||||
Commands:
|
Commands:
|
||||||
--version (-v) Print version information
|
--version (-v) Print version information
|
||||||
|
--display-terms Display current terms of service
|
||||||
--register Register account key
|
--register Register account key
|
||||||
--account Update account contact information
|
--account Update account contact information
|
||||||
--cron (-c) Sign/renew non-existent/changed/expiring certificates.
|
--cron (-c) Sign/renew non-existent/changed/expiring certificates.
|
||||||
--signcsr (-s) path/to/csr.pem Sign a given CSR, output CRT on stdout (advanced usage)
|
--signcsr (-s) path/to/csr.pem Sign a given CSR, output CRT on stdout (advanced usage)
|
||||||
--revoke (-r) path/to/cert.pem Revoke specified certificate
|
--revoke (-r) path/to/cert.pem Revoke specified certificate
|
||||||
|
--deactivate Deactivate account
|
||||||
--cleanup (-gc) Move unused certificate files to archive directory
|
--cleanup (-gc) Move unused certificate files to archive directory
|
||||||
|
--cleanup-delete (-gcd) Deletes (!) unused certificate files
|
||||||
--help (-h) Show help text
|
--help (-h) Show help text
|
||||||
--env (-e) Output configuration variables for use in other scripts
|
--env (-e) Output configuration variables for use in other scripts
|
||||||
|
|
||||||
@@ -64,39 +68,21 @@ Parameters:
|
|||||||
--ipv4 (-4) Resolve names to IPv4 addresses only
|
--ipv4 (-4) Resolve names to IPv4 addresses only
|
||||||
--ipv6 (-6) Resolve names to IPv6 addresses only
|
--ipv6 (-6) Resolve names to IPv6 addresses only
|
||||||
--domain (-d) domain.tld Use specified domain name(s) instead of domains.txt entry (one certificate!)
|
--domain (-d) domain.tld Use specified domain name(s) instead of domains.txt entry (one certificate!)
|
||||||
|
--ca url/preset Use specified CA URL or preset
|
||||||
--alias certalias Use specified name for certificate directory (and per-certificate config) instead of the primary domain (only used if --domain is specified)
|
--alias certalias Use specified name for certificate directory (and per-certificate config) instead of the primary domain (only used if --domain is specified)
|
||||||
--keep-going (-g) Keep going after encountering an error while creating/renewing multiple certificates in cron mode
|
--keep-going (-g) Keep going after encountering an error while creating/renewing multiple certificates in cron mode
|
||||||
--force (-x) Force renew of certificate even if it is longer valid than value in RENEW_DAYS
|
--force (-x) Force renew of certificate even if it is longer valid than value in RENEW_DAYS
|
||||||
|
--force-validation Force revalidation of domain names (used in combination with --force)
|
||||||
--no-lock (-n) Don't use lockfile (potentially dangerous!)
|
--no-lock (-n) Don't use lockfile (potentially dangerous!)
|
||||||
--lock-suffix example.com Suffix lockfile name with a string (useful for with -d)
|
--lock-suffix example.com Suffix lockfile name with a string (useful for with -d)
|
||||||
--ocsp Sets option in CSR indicating OCSP stapling to be mandatory
|
--ocsp Sets option in CSR indicating OCSP stapling to be mandatory
|
||||||
--privkey (-p) path/to/key.pem Use specified private key instead of account key (useful for revocation)
|
--privkey (-p) path/to/key.pem Use specified private key instead of account key (useful for revocation)
|
||||||
|
--domains-txt path/to/domains.txt Use specified domains.txt instead of default/configured one
|
||||||
--config (-f) path/to/config Use specified config file
|
--config (-f) path/to/config Use specified config file
|
||||||
--hook (-k) path/to/hook.sh Use specified script for hooks
|
--hook (-k) path/to/hook.sh Use specified script for hooks
|
||||||
|
--preferred-chain issuer-cn Use alternative certificate chain identified by issuer CN
|
||||||
--out (-o) certs/directory Output certificates into the specified directory
|
--out (-o) certs/directory Output certificates into the specified directory
|
||||||
--alpn alpn-certs/directory Output alpn verification certificates into the specified directory
|
--alpn alpn-certs/directory Output alpn verification certificates into the specified directory
|
||||||
--challenge (-t) http-01|dns-01 Which challenge should be used? Currently http-01 and dns-01 are supported
|
--challenge (-t) http-01|dns-01|tls-alpn-01 Which challenge should be used? Currently http-01, dns-01, and tls-alpn-01 are supported
|
||||||
--algo (-a) rsa|prime256v1|secp384r1 Which public key algorithm should be used? Supported: rsa, prime256v1 and secp384r1
|
--algo (-a) rsa|prime256v1|secp384r1 Which public key algorithm should be used? Supported: rsa, prime256v1 and secp384r1
|
||||||
```
|
```
|
||||||
|
|
||||||
## Donate
|
|
||||||
|
|
||||||
I'm a student hacker with a few (unfortunately) quite expensive hobbies (self-hosting, virtualization clusters, routing,
|
|
||||||
high-speed networking, embedded hardware, etc.).
|
|
||||||
I'm really having fun playing around with hard- and software and I'm steadily learning new things.
|
|
||||||
Without those hobbies I probably would never have started working on dehydrated to begin with :)
|
|
||||||
|
|
||||||
I'd really appreciate if you could [donate a bit of money](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=23P9DSJBTY7C8)
|
|
||||||
so I can buy cool stuff (while still being able to afford food :D).
|
|
||||||
|
|
||||||
If you have hardware laying around that you think I'd enjoy playing with (e.g. decommissioned but still modern-ish servers,
|
|
||||||
10G networking hardware, enterprise grade routers or APs, interesting ARM/MIPS boards, etc.) and that you would be willing
|
|
||||||
to ship to me please contact me at `donations@dehydrated.io` or on Twitter [@lukas2511](https://twitter.com/lukas2511).
|
|
||||||
|
|
||||||
If you want your name to be added to the [donations list](https://dehydrated.io/donations.html) please add a note or send me an
|
|
||||||
email `donations@dehydrated.io`. I respect your privacy and won't publish your name without permission.
|
|
||||||
|
|
||||||
Other ways of donating:
|
|
||||||
- [My Amazon Wishlist](http://www.amazon.de/registry/wishlist/1TUCFJK35IO4Q)
|
|
||||||
- Monero: 4Kkf4tF4r9DakxLj37HDXLJgmpVfQoFhT7JLDvXwtUZZMTbsK9spsAPXivWPAFcDUj6jHhY8hJSHX8Cb8ndMhKeQHPSkBZZiK89Fx8NTHk
|
|
||||||
- Bitcoin: 12487bHxcrREffTGwUDnoxF1uYxCA7ztKK
|
|
||||||
|
|||||||
1032
dehydrated
1032
dehydrated
File diff suppressed because it is too large
Load Diff
@@ -28,4 +28,4 @@ Or when you do have a DNS API, pass the details accordingly to achieve the same
|
|||||||
|
|
||||||
You can delete the TXT record when called with operation `clean_challenge`, when $2 is also the domain name.
|
You can delete the TXT record when called with operation `clean_challenge`, when $2 is also the domain name.
|
||||||
|
|
||||||
Here are some examples: [Examples for DNS-01 hooks](https://github.com/lukas2511/dehydrated/wiki/Examples-for-DNS-01-hooks)
|
Here are some examples: [Examples for DNS-01 hooks](https://github.com/dehydrated-io/dehydrated/wiki)
|
||||||
|
|||||||
@@ -34,6 +34,30 @@ under your `CERTDIR`.
|
|||||||
example.net www.example.net wiki.example.net > certalias
|
example.net www.example.net wiki.example.net > certalias
|
||||||
```
|
```
|
||||||
|
|
||||||
|
This allows to set per certificates options. The options you can change are
|
||||||
|
explained in [Per Certificate Config](per-certificate-config.md).
|
||||||
|
|
||||||
|
If you want to create different certificate types for the same domain
|
||||||
|
you can use:
|
||||||
|
|
||||||
|
```text
|
||||||
|
*.service.example.org service.example.org > star_service_example_org_rsa
|
||||||
|
*.service.example.org service.example.org > star_service_example_org_ecdsa
|
||||||
|
```
|
||||||
|
|
||||||
|
Then add a config file `certs/star_service_example_org_rsa/config` with
|
||||||
|
the value
|
||||||
|
|
||||||
|
```
|
||||||
|
KEY_ALGO="rsa"
|
||||||
|
```
|
||||||
|
|
||||||
|
or respectively
|
||||||
|
|
||||||
|
```
|
||||||
|
KEY_ALGO="ecdsa"
|
||||||
|
```
|
||||||
|
|
||||||
### Wildcards
|
### Wildcards
|
||||||
|
|
||||||
Support for wildcards was added by the ACME v2 protocol.
|
Support for wildcards was added by the ACME v2 protocol.
|
||||||
@@ -70,3 +94,14 @@ This creates two certificates one for `service.example.com` with an
|
|||||||
**Note:** The first certificate is valid for both `service.example.com` and for
|
**Note:** The first certificate is valid for both `service.example.com` and for
|
||||||
`*.service.example.com` which can be a useful way to create wildcard
|
`*.service.example.com` which can be a useful way to create wildcard
|
||||||
certificates.
|
certificates.
|
||||||
|
|
||||||
|
### Drop-in directory
|
||||||
|
|
||||||
|
If a directory named `domains.txt.d` exists in the same location as
|
||||||
|
`domains.txt`, the contents of `*.txt` files in that directory are appended to
|
||||||
|
the list of domains, in alphabetical order of the filenames. This is useful for
|
||||||
|
automation, as it doesn't require editing an existing file to add new domains.
|
||||||
|
|
||||||
|
Warning: Behaviour of this might change as the naming between `domains.txt.d`
|
||||||
|
and the `DOMAINS_D` config variable (which is used for per-certificate
|
||||||
|
configuration) is a bit confusing.
|
||||||
|
|||||||
@@ -10,10 +10,10 @@
|
|||||||
# Default values of this config are in comments #
|
# Default values of this config are in comments #
|
||||||
########################################################
|
########################################################
|
||||||
|
|
||||||
# Which user should dehydrated run as? This will be implictly enforced when running as root
|
# Which user should dehydrated run as? This will be implicitly enforced when running as root
|
||||||
#DEHYDRATED_USER=
|
#DEHYDRATED_USER=
|
||||||
|
|
||||||
# Which group should dehydrated run as? This will be implictly enforced when running as root
|
# Which group should dehydrated run as? This will be implicitly enforced when running as root
|
||||||
#DEHYDRATED_GROUP=
|
#DEHYDRATED_GROUP=
|
||||||
|
|
||||||
# Resolve names to addresses of IP version only. (curl)
|
# Resolve names to addresses of IP version only. (curl)
|
||||||
@@ -21,8 +21,10 @@
|
|||||||
# default: <unset>
|
# default: <unset>
|
||||||
#IP_VERSION=
|
#IP_VERSION=
|
||||||
|
|
||||||
# Path to certificate authority (default: https://acme-v02.api.letsencrypt.org/directory)
|
# URL to certificate authority or internal preset
|
||||||
#CA="https://acme-v02.api.letsencrypt.org/directory"
|
# Presets: letsencrypt, letsencrypt-test, zerossl, buypass, buypass-test
|
||||||
|
# default: letsencrypt
|
||||||
|
#CA="letsencrypt"
|
||||||
|
|
||||||
# Path to old certificate authority
|
# Path to old certificate authority
|
||||||
# Set this value to your old CA value when upgrading from ACMEv1 to ACMEv2 under a different endpoint.
|
# Set this value to your old CA value when upgrading from ACMEv1 to ACMEv2 under a different endpoint.
|
||||||
@@ -100,7 +102,7 @@
|
|||||||
#PRIVATE_KEY_ROLLOVER="no"
|
#PRIVATE_KEY_ROLLOVER="no"
|
||||||
|
|
||||||
# Which public key algorithm should be used? Supported: rsa, prime256v1 and secp384r1
|
# Which public key algorithm should be used? Supported: rsa, prime256v1 and secp384r1
|
||||||
#KEY_ALGO=rsa
|
#KEY_ALGO=secp384r1
|
||||||
|
|
||||||
# E-mail to use during the registration (default: <unset>)
|
# E-mail to use during the registration (default: <unset>)
|
||||||
#CONTACT_EMAIL=
|
#CONTACT_EMAIL=
|
||||||
@@ -125,3 +127,6 @@
|
|||||||
|
|
||||||
# ACME API version (default: auto)
|
# ACME API version (default: auto)
|
||||||
#API=auto
|
#API=auto
|
||||||
|
|
||||||
|
# Preferred issuer chain (default: <unset> -> uses default chain)
|
||||||
|
#PREFERRED_CHAIN=
|
||||||
|
|||||||
@@ -24,6 +24,15 @@ example.net www.example.net > certalias
|
|||||||
# NOTE: It is a certificate for 'service.example.org'
|
# NOTE: It is a certificate for 'service.example.org'
|
||||||
*.service.example.org service.example.org > star_service_example_org
|
*.service.example.org service.example.org > star_service_example_org
|
||||||
|
|
||||||
|
# Optionally you can also append the certificate algorithm here to create
|
||||||
|
# multiple certificate types for the same domain.
|
||||||
|
#
|
||||||
|
# This allows to set per certificates options. How to do this is
|
||||||
|
# explained in [domains.txt documentation](domains_txt.md).
|
||||||
|
#
|
||||||
|
*.service.example.org service.example.org > star_service_example_org_rsa
|
||||||
|
*.service.example.org service.example.org > star_service_example_org_ecdsa
|
||||||
|
|
||||||
# Create a certificate for 'service.example.net' with an alternative name of
|
# Create a certificate for 'service.example.net' with an alternative name of
|
||||||
# '*.service.example.net' (which is a wildcard domain) and store it in the
|
# '*.service.example.net' (which is a wildcard domain) and store it in the
|
||||||
# directory ${CERTDIR}/service.example.net
|
# directory ${CERTDIR}/service.example.net
|
||||||
|
|||||||
@@ -1,199 +1,199 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
deploy_challenge() {
|
deploy_challenge() {
|
||||||
local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"
|
local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"
|
||||||
|
|
||||||
# This hook is called once for every domain that needs to be
|
# This hook is called once for every domain that needs to be
|
||||||
# validated, including any alternative names you may have listed.
|
# validated, including any alternative names you may have listed.
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# - DOMAIN
|
# - DOMAIN
|
||||||
# The domain name (CN or subject alternative name) being
|
# The domain name (CN or subject alternative name) being
|
||||||
# validated.
|
# validated.
|
||||||
# - TOKEN_FILENAME
|
# - TOKEN_FILENAME
|
||||||
# The name of the file containing the token to be served for HTTP
|
# The name of the file containing the token to be served for HTTP
|
||||||
# validation. Should be served by your web server as
|
# validation. Should be served by your web server as
|
||||||
# /.well-known/acme-challenge/${TOKEN_FILENAME}.
|
# /.well-known/acme-challenge/${TOKEN_FILENAME}.
|
||||||
# - TOKEN_VALUE
|
# - TOKEN_VALUE
|
||||||
# The token value that needs to be served for validation. For DNS
|
# The token value that needs to be served for validation. For DNS
|
||||||
# validation, this is what you want to put in the _acme-challenge
|
# validation, this is what you want to put in the _acme-challenge
|
||||||
# TXT record. For HTTP validation it is the value that is expected
|
# TXT record. For HTTP validation it is the value that is expected
|
||||||
# be found in the $TOKEN_FILENAME file.
|
# be found in the $TOKEN_FILENAME file.
|
||||||
|
|
||||||
# Simple example: Use nsupdate with local named
|
# Simple example: Use nsupdate with local named
|
||||||
# printf 'server 127.0.0.1\nupdate add _acme-challenge.%s 300 IN TXT "%s"\nsend\n' "${DOMAIN}" "${TOKEN_VALUE}" | nsupdate -k /var/run/named/session.key
|
# printf 'server 127.0.0.1\nupdate add _acme-challenge.%s 300 IN TXT "%s"\nsend\n' "${DOMAIN}" "${TOKEN_VALUE}" | nsupdate -k /var/run/named/session.key
|
||||||
}
|
}
|
||||||
|
|
||||||
clean_challenge() {
|
clean_challenge() {
|
||||||
local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"
|
local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"
|
||||||
|
|
||||||
# This hook is called after attempting to validate each domain,
|
# This hook is called after attempting to validate each domain,
|
||||||
# whether or not validation was successful. Here you can delete
|
# whether or not validation was successful. Here you can delete
|
||||||
# files or DNS records that are no longer needed.
|
# files or DNS records that are no longer needed.
|
||||||
#
|
#
|
||||||
# The parameters are the same as for deploy_challenge.
|
# The parameters are the same as for deploy_challenge.
|
||||||
|
|
||||||
# Simple example: Use nsupdate with local named
|
# Simple example: Use nsupdate with local named
|
||||||
# printf 'server 127.0.0.1\nupdate delete _acme-challenge.%s TXT "%s"\nsend\n' "${DOMAIN}" "${TOKEN_VALUE}" | nsupdate -k /var/run/named/session.key
|
# printf 'server 127.0.0.1\nupdate delete _acme-challenge.%s TXT "%s"\nsend\n' "${DOMAIN}" "${TOKEN_VALUE}" | nsupdate -k /var/run/named/session.key
|
||||||
}
|
}
|
||||||
|
|
||||||
sync_cert() {
|
sync_cert() {
|
||||||
local KEYFILE="${1}" CERTFILE="${2}" FULLCHAINFILE="${3}" CHAINFILE="${4}" REQUESTFILE="${5}"
|
local KEYFILE="${1}" CERTFILE="${2}" FULLCHAINFILE="${3}" CHAINFILE="${4}" REQUESTFILE="${5}"
|
||||||
|
|
||||||
# This hook is called after the certificates have been created but before
|
# This hook is called after the certificates have been created but before
|
||||||
# they are symlinked. This allows you to sync the files to disk to prevent
|
# they are symlinked. This allows you to sync the files to disk to prevent
|
||||||
# creating a symlink to empty files on unexpected system crashes.
|
# creating a symlink to empty files on unexpected system crashes.
|
||||||
#
|
#
|
||||||
# This hook is not intended to be used for further processing of certificate
|
# This hook is not intended to be used for further processing of certificate
|
||||||
# files, see deploy_cert for that.
|
# files, see deploy_cert for that.
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# - KEYFILE
|
# - KEYFILE
|
||||||
# The path of the file containing the private key.
|
# The path of the file containing the private key.
|
||||||
# - CERTFILE
|
# - CERTFILE
|
||||||
# The path of the file containing the signed certificate.
|
# The path of the file containing the signed certificate.
|
||||||
# - FULLCHAINFILE
|
# - FULLCHAINFILE
|
||||||
# The path of the file containing the full certificate chain.
|
# The path of the file containing the full certificate chain.
|
||||||
# - CHAINFILE
|
# - CHAINFILE
|
||||||
# The path of the file containing the intermediate certificate(s).
|
# The path of the file containing the intermediate certificate(s).
|
||||||
# - REQUESTFILE
|
# - REQUESTFILE
|
||||||
# The path of the file containing the certificate signing request.
|
# The path of the file containing the certificate signing request.
|
||||||
|
|
||||||
# Simple example: sync the files before symlinking them
|
# Simple example: sync the files before symlinking them
|
||||||
# sync "${KEYFILE}" "${CERTFILE} "${FULLCHAINFILE}" "${CHAINFILE}" "${REQUESTFILE}"
|
# sync "${KEYFILE}" "${CERTFILE}" "${FULLCHAINFILE}" "${CHAINFILE}" "${REQUESTFILE}"
|
||||||
}
|
}
|
||||||
|
|
||||||
deploy_cert() {
|
deploy_cert() {
|
||||||
local DOMAIN="${1}" KEYFILE="${2}" CERTFILE="${3}" FULLCHAINFILE="${4}" CHAINFILE="${5}" TIMESTAMP="${6}"
|
local DOMAIN="${1}" KEYFILE="${2}" CERTFILE="${3}" FULLCHAINFILE="${4}" CHAINFILE="${5}" TIMESTAMP="${6}"
|
||||||
|
|
||||||
# This hook is called once for each certificate that has been
|
# This hook is called once for each certificate that has been
|
||||||
# produced. Here you might, for instance, copy your new certificates
|
# produced. Here you might, for instance, copy your new certificates
|
||||||
# to service-specific locations and reload the service.
|
# to service-specific locations and reload the service.
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# - DOMAIN
|
# - DOMAIN
|
||||||
# The primary domain name, i.e. the certificate common
|
# The primary domain name, i.e. the certificate common
|
||||||
# name (CN).
|
# name (CN).
|
||||||
# - KEYFILE
|
# - KEYFILE
|
||||||
# The path of the file containing the private key.
|
# The path of the file containing the private key.
|
||||||
# - CERTFILE
|
# - CERTFILE
|
||||||
# The path of the file containing the signed certificate.
|
# The path of the file containing the signed certificate.
|
||||||
# - FULLCHAINFILE
|
# - FULLCHAINFILE
|
||||||
# The path of the file containing the full certificate chain.
|
# The path of the file containing the full certificate chain.
|
||||||
# - CHAINFILE
|
# - CHAINFILE
|
||||||
# The path of the file containing the intermediate certificate(s).
|
# The path of the file containing the intermediate certificate(s).
|
||||||
# - TIMESTAMP
|
# - TIMESTAMP
|
||||||
# Timestamp when the specified certificate was created.
|
# Timestamp when the specified certificate was created.
|
||||||
|
|
||||||
# Simple example: Copy file to nginx config
|
# Simple example: Copy file to nginx config
|
||||||
# cp "${KEYFILE}" "${FULLCHAINFILE}" /etc/nginx/ssl/; chown -R nginx: /etc/nginx/ssl
|
# cp "${KEYFILE}" "${FULLCHAINFILE}" /etc/nginx/ssl/; chown -R nginx: /etc/nginx/ssl
|
||||||
# systemctl reload nginx
|
# systemctl reload nginx
|
||||||
}
|
}
|
||||||
|
|
||||||
deploy_ocsp() {
|
deploy_ocsp() {
|
||||||
local DOMAIN="${1}" OCSPFILE="${2}" TIMESTAMP="${3}"
|
local DOMAIN="${1}" OCSPFILE="${2}" TIMESTAMP="${3}"
|
||||||
|
|
||||||
# This hook is called once for each updated ocsp stapling file that has
|
# This hook is called once for each updated ocsp stapling file that has
|
||||||
# been produced. Here you might, for instance, copy your new ocsp stapling
|
# been produced. Here you might, for instance, copy your new ocsp stapling
|
||||||
# files to service-specific locations and reload the service.
|
# files to service-specific locations and reload the service.
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# - DOMAIN
|
# - DOMAIN
|
||||||
# The primary domain name, i.e. the certificate common
|
# The primary domain name, i.e. the certificate common
|
||||||
# name (CN).
|
# name (CN).
|
||||||
# - OCSPFILE
|
# - OCSPFILE
|
||||||
# The path of the ocsp stapling file
|
# The path of the ocsp stapling file
|
||||||
# - TIMESTAMP
|
# - TIMESTAMP
|
||||||
# Timestamp when the specified ocsp stapling file was created.
|
# Timestamp when the specified ocsp stapling file was created.
|
||||||
|
|
||||||
# Simple example: Copy file to nginx config
|
# Simple example: Copy file to nginx config
|
||||||
# cp "${OCSPFILE}" /etc/nginx/ssl/; chown -R nginx: /etc/nginx/ssl
|
# cp "${OCSPFILE}" /etc/nginx/ssl/; chown -R nginx: /etc/nginx/ssl
|
||||||
# systemctl reload nginx
|
# systemctl reload nginx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unchanged_cert() {
|
unchanged_cert() {
|
||||||
local DOMAIN="${1}" KEYFILE="${2}" CERTFILE="${3}" FULLCHAINFILE="${4}" CHAINFILE="${5}"
|
local DOMAIN="${1}" KEYFILE="${2}" CERTFILE="${3}" FULLCHAINFILE="${4}" CHAINFILE="${5}"
|
||||||
|
|
||||||
# This hook is called once for each certificate that is still
|
# This hook is called once for each certificate that is still
|
||||||
# valid and therefore wasn't reissued.
|
# valid and therefore wasn't reissued.
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# - DOMAIN
|
# - DOMAIN
|
||||||
# The primary domain name, i.e. the certificate common
|
# The primary domain name, i.e. the certificate common
|
||||||
# name (CN).
|
# name (CN).
|
||||||
# - KEYFILE
|
# - KEYFILE
|
||||||
# The path of the file containing the private key.
|
# The path of the file containing the private key.
|
||||||
# - CERTFILE
|
# - CERTFILE
|
||||||
# The path of the file containing the signed certificate.
|
# The path of the file containing the signed certificate.
|
||||||
# - FULLCHAINFILE
|
# - FULLCHAINFILE
|
||||||
# The path of the file containing the full certificate chain.
|
# The path of the file containing the full certificate chain.
|
||||||
# - CHAINFILE
|
# - CHAINFILE
|
||||||
# The path of the file containing the intermediate certificate(s).
|
# The path of the file containing the intermediate certificate(s).
|
||||||
}
|
}
|
||||||
|
|
||||||
invalid_challenge() {
|
invalid_challenge() {
|
||||||
local DOMAIN="${1}" RESPONSE="${2}"
|
local DOMAIN="${1}" RESPONSE="${2}"
|
||||||
|
|
||||||
# This hook is called if the challenge response has failed, so domain
|
# This hook is called if the challenge response has failed, so domain
|
||||||
# owners can be aware and act accordingly.
|
# owners can be aware and act accordingly.
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# - DOMAIN
|
# - DOMAIN
|
||||||
# The primary domain name, i.e. the certificate common
|
# The primary domain name, i.e. the certificate common
|
||||||
# name (CN).
|
# name (CN).
|
||||||
# - RESPONSE
|
# - RESPONSE
|
||||||
# The response that the verification server returned
|
# The response that the verification server returned
|
||||||
|
|
||||||
# Simple example: Send mail to root
|
# Simple example: Send mail to root
|
||||||
# printf "Subject: Validation of ${DOMAIN} failed!\n\nOh noez!" | sendmail root
|
# printf "Subject: Validation of ${DOMAIN} failed!\n\nOh noez!" | sendmail root
|
||||||
}
|
}
|
||||||
|
|
||||||
request_failure() {
|
request_failure() {
|
||||||
local STATUSCODE="${1}" REASON="${2}" REQTYPE="${3}" HEADERS="${4}"
|
local STATUSCODE="${1}" REASON="${2}" REQTYPE="${3}" HEADERS="${4}"
|
||||||
|
|
||||||
# This hook is called when an HTTP request fails (e.g., when the ACME
|
# This hook is called when an HTTP request fails (e.g., when the ACME
|
||||||
# server is busy, returns an error, etc). It will be called upon any
|
# server is busy, returns an error, etc). It will be called upon any
|
||||||
# response code that does not start with '2'. Useful to alert admins
|
# response code that does not start with '2'. Useful to alert admins
|
||||||
# about problems with requests.
|
# about problems with requests.
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# - STATUSCODE
|
# - STATUSCODE
|
||||||
# The HTML status code that originated the error.
|
# The HTML status code that originated the error.
|
||||||
# - REASON
|
# - REASON
|
||||||
# The specified reason for the error.
|
# The specified reason for the error.
|
||||||
# - REQTYPE
|
# - REQTYPE
|
||||||
# The kind of request that was made (GET, POST...)
|
# The kind of request that was made (GET, POST...)
|
||||||
# - HEADERS
|
# - HEADERS
|
||||||
# HTTP headers returned by the CA
|
# HTTP headers returned by the CA
|
||||||
|
|
||||||
# Simple example: Send mail to root
|
# Simple example: Send mail to root
|
||||||
# printf "Subject: HTTP request failed failed!\n\nA http request failed with status ${STATUSCODE}!" | sendmail root
|
# printf "Subject: HTTP request failed failed!\n\nA http request failed with status ${STATUSCODE}!" | sendmail root
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_csr() {
|
generate_csr() {
|
||||||
local DOMAIN="${1}" CERTDIR="${2}" ALTNAMES="${3}"
|
local DOMAIN="${1}" CERTDIR="${2}" ALTNAMES="${3}"
|
||||||
|
|
||||||
# This hook is called before any certificate signing operation takes place.
|
# This hook is called before any certificate signing operation takes place.
|
||||||
# It can be used to generate or fetch a certificate signing request with external
|
# It can be used to generate or fetch a certificate signing request with external
|
||||||
# tools.
|
# tools.
|
||||||
# The output should be just the cerificate signing request formatted as PEM.
|
# The output should be just the certificate signing request formatted as PEM.
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# - DOMAIN
|
# - DOMAIN
|
||||||
# The primary domain as specified in domains.txt. This does not need to
|
# The primary domain as specified in domains.txt. This does not need to
|
||||||
# match with the domains in the CSR, it's basically just the directory name.
|
# match with the domains in the CSR, it's basically just the directory name.
|
||||||
# - CERTDIR
|
# - CERTDIR
|
||||||
# Certificate output directory for this particular certificate. Can be used
|
# Certificate output directory for this particular certificate. Can be used
|
||||||
# for storing additional files.
|
# for storing additional files.
|
||||||
# - ALTNAMES
|
# - ALTNAMES
|
||||||
# All domain names for the current certificate as specified in domains.txt.
|
# All domain names for the current certificate as specified in domains.txt.
|
||||||
# Again, this doesn't need to match with the CSR, it's just there for convenience.
|
# Again, this doesn't need to match with the CSR, it's just there for convenience.
|
||||||
|
|
||||||
# Simple example: Look for pre-generated CSRs
|
# Simple example: Look for pre-generated CSRs
|
||||||
# if [ -e "${CERTDIR}/pre-generated.csr" ]; then
|
# if [ -e "${CERTDIR}/pre-generated.csr" ]; then
|
||||||
# cat "${CERTDIR}/pre-generated.csr"
|
# cat "${CERTDIR}/pre-generated.csr"
|
||||||
# fi
|
# fi
|
||||||
}
|
}
|
||||||
|
|
||||||
startup_hook() {
|
startup_hook() {
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
# Import
|
|
||||||
|
|
||||||
If you want to import existing keys from the official letsencrypt client have a look at [Import from official letsencrypt client](https://github.com/lukas2511/dehydrated/wiki/Import-from-official-letsencrypt-client).
|
|
||||||
BIN
docs/logo.jpg
BIN
docs/logo.jpg
Binary file not shown.
|
Before Width: | Height: | Size: 42 KiB |
BIN
docs/logo.png
Normal file
BIN
docs/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
@@ -11,12 +11,15 @@ Currently supported options:
|
|||||||
- KEY_ALGO
|
- KEY_ALGO
|
||||||
- KEYSIZE
|
- KEYSIZE
|
||||||
- OCSP_MUST_STAPLE
|
- OCSP_MUST_STAPLE
|
||||||
|
- OCSP_FETCH
|
||||||
|
- OCSP_DAYS
|
||||||
- CHALLENGETYPE
|
- CHALLENGETYPE
|
||||||
- HOOK
|
- HOOK
|
||||||
- HOOK_CHAIN
|
- HOOK_CHAIN
|
||||||
- WELLKNOWN
|
- WELLKNOWN
|
||||||
- OPENSSL_CNF
|
- OPENSSL_CNF
|
||||||
- RENEW_DAYS
|
- RENEW_DAYS
|
||||||
|
- PREFERRED_CHAIN
|
||||||
|
|
||||||
## DOMAINS_D
|
## DOMAINS_D
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,7 @@ 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 file:
|
To avoid this, please set the CA property to the Let’s Encrypt staging server URL in your config file:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
CA="https://acme-staging.api.letsencrypt.org/directory"
|
CA="https://acme-staging-v02.api.letsencrypt.org/directory"
|
||||||
```
|
```
|
||||||
|
|
||||||
# ACMEv2 staging
|
Alternatively you can define the CA using the CLI argument `--ca letsencrypt-test` (`letsencrypt-test` is an integrated preset-CA corresponding to the URL above).
|
||||||
|
|
||||||
You can use `CA="https://acme-staging-v02.api.letsencrypt.org/directory"` to test dehydrated with
|
|
||||||
the ACMEv2 staging endpoint.
|
|
||||||
|
|||||||
@@ -6,6 +6,26 @@ It will do that for any (sub-)domain you want to sign a certificate for.
|
|||||||
|
|
||||||
Dehydrated generates the required verification certificates, but the delivery is out of its scope.
|
Dehydrated generates the required verification certificates, but the delivery is out of its scope.
|
||||||
|
|
||||||
|
### Example lighttpd config
|
||||||
|
|
||||||
|
lighttpd can be configured to recognize ALPN `acme-tls/1` and to respond to such
|
||||||
|
requests using the specially crafted TLS certificates generated by dehydrated.
|
||||||
|
Configure lighttpd and dehydrated to use the same path for these certificates.
|
||||||
|
(Be sure to allow read access to the user account under which the lighttpd
|
||||||
|
server is running.) `mkdir -p /etc/dehydrated/alpn-certs`
|
||||||
|
|
||||||
|
lighttpd.conf:
|
||||||
|
```
|
||||||
|
ssl.acme-tls-1 = "/etc/dehydrated/alpn-certs"
|
||||||
|
```
|
||||||
|
|
||||||
|
When renewing certificates, specify `-t tls-alpn-01` and `--alpn /etc/dehydrated/alpn-certs` to dehydrated, e.g.
|
||||||
|
```
|
||||||
|
dehydrated -t tls-alpn-01 --alpn /etc/dehydrated/alpn-certs -c --out /etc/lighttpd/certs -d www.example.com
|
||||||
|
# gracefully reload lighttpd to use the new certificates by sending lighttpd pid SIGUSR1
|
||||||
|
systemctl reload lighttpd
|
||||||
|
```
|
||||||
|
|
||||||
### Example nginx config
|
### Example nginx config
|
||||||
|
|
||||||
On an nginx tcp load-balancer you can use the `ssl_preread` module to map a different port for acme-tls
|
On an nginx tcp load-balancer you can use the `ssl_preread` module to map a different port for acme-tls
|
||||||
@@ -15,18 +35,16 @@ Your config should look something like this:
|
|||||||
|
|
||||||
```nginx
|
```nginx
|
||||||
stream {
|
stream {
|
||||||
server {
|
map $ssl_preread_alpn_protocols $tls_port {
|
||||||
map $ssl_preread_alpn_protocols $tls_port {
|
~\bacme-tls/1\b 10443;
|
||||||
~\bacme-tls/1\b 10443;
|
default 443;
|
||||||
default 443;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443;
|
listen 443;
|
||||||
listen [::]:443;
|
listen [::]:443;
|
||||||
proxy_pass 10.13.37.42:$tls_port;
|
proxy_pass 10.13.37.42:$tls_port;
|
||||||
ssl_preread on;
|
ssl_preread on;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user