|
#!/usr/bin/env bash |
|
|
|
set -e |
|
|
|
BASE_DIR="$(dirname "$0")" |
|
CHALLENGE_DIR="${BASE_DIR}/.acme-challenges" |
|
CERT_DIR="/etc/ssl/letsencrypt" |
|
|
|
|
|
function deploy_challenge { |
|
local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}" |
|
|
|
# This hook is called once for every domain that needs to be |
|
# validated, including any alternative names you may have listed. |
|
# |
|
# Parameters: |
|
# - DOMAIN |
|
# The domain name (CN or subject alternative name) being |
|
# validated. |
|
# - TOKEN_FILENAME |
|
# The name of the file containing the token to be served for HTTP |
|
# validation. Should be served by your web server as |
|
# /.well-known/acme-challenge/${TOKEN_FILENAME}. |
|
# - TOKEN_VALUE |
|
# The token value that needs to be served for validation. For DNS |
|
# validation, this is what you want to put in the _acme-challenge |
|
# TXT record. For HTTP validation it is the value that is expected |
|
# be found in the $TOKEN_FILENAME file. |
|
case "${DOMAIN}" in |
|
fixme.foo) setup_path "/chroot/fixme-foo" ;; |
|
esac |
|
} |
|
|
|
function clean_challenge { |
|
local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}" |
|
|
|
# This hook is called after attempting to validate each domain, |
|
# whether or not validation was successful. Here you can delete |
|
# files or DNS records that are no longer needed. |
|
# |
|
# The parameters are the same as for deploy_challenge. |
|
case "${DOMAIN}" in |
|
fixme.foo) clean_path "/chroot/fixme-foo" ;; |
|
esac |
|
} |
|
|
|
function setup_path() { |
|
local DEST_DIR="$1" |
|
|
|
mkdir -p "${DEST_DIR}/${CHALLENGE_DIR}" |
|
find "${DEST_DIR}/${BASE_DIR}" -type d -exec chmod 0775 {} \; |
|
|
|
mv "${CHALLENGE_DIR}/${TOKEN_FILENAME}" "${DEST_DIR}/${CHALLENGE_DIR}/" |
|
chmod 0444 "${DEST_DIR}/${CHALLENGE_DIR}/${TOKEN_FILENAME}" |
|
} |
|
|
|
function clean_path() { |
|
local DEST_DIR="$1" |
|
|
|
if [ -e "${DEST_DIR}/${CHALLENGE_DIR}/${TOKEN_FILENAME}" ] |
|
then |
|
rm "${DEST_DIR}/${CHALLENGE_DIR}/${TOKEN_FILENAME}" |
|
fi |
|
} |
|
|
|
function deploy_cert { |
|
local DOMAIN="${1}" KEYFILE="${2}" CERTFILE="${3}" FULLCHAINFILE="${4}" CHAINFILE="${5}" |
|
|
|
# This hook is called once for each certificate that has been |
|
# produced. Here you might, for instance, copy your new certificates |
|
# to service-specific locations and reload the service. |
|
# |
|
# Parameters: |
|
# - DOMAIN |
|
# The primary domain name, i.e. the certificate common |
|
# name (CN). |
|
# - KEYFILE |
|
# The path of the file containing the private key. |
|
# - CERTFILE |
|
# The path of the file containing the signed certificate. |
|
# - FULLCHAINFILE |
|
# The path of the file containing the full certificate chain. |
|
# - CHAINFILE |
|
# The path of the file containing the intermediate certificate(s). |
|
mkdir -p "${CERT_DIR}" |
|
chmod 755 "${CERT_DIR}" |
|
|
|
install -o root -g root -m 600 "${KEYFILE}" "${CERT_DIR}/${DOMAIN//[.]/_}.key" |
|
install -o root -g root -m 644 "${FULLCHAINFILE}" "${CERT_DIR}/${DOMAIN//[.]/_}.pem" |
|
|
|
# RELOAD / RESTART WEBSERVER FOR APPLY CERT CHANGES |
|
} |
|
|
|
function unchanged_cert { |
|
local DOMAIN="${1}" KEYFILE="${2}" CERTFILE="${3}" FULLCHAINFILE="${4}" CHAINFILE="${5}" |
|
|
|
# This hook is called once for each certificate that is still |
|
# valid and therefore wasn't reissued. |
|
# |
|
# Parameters: |
|
# - DOMAIN |
|
# The primary domain name, i.e. the certificate common |
|
# name (CN). |
|
# - KEYFILE |
|
# The path of the file containing the private key. |
|
# - CERTFILE |
|
# The path of the file containing the signed certificate. |
|
# - FULLCHAINFILE |
|
# The path of the file containing the full certificate chain. |
|
# - CHAINFILE |
|
# The path of the file containing the intermediate certificate(s). |
|
} |
|
|
|
HANDLER="$1"; shift |
|
$HANDLER "$@" |