-
-
Save teamblack-ci/b853bf2c360f7e528e6b1b0aad9995f6 to your computer and use it in GitHub Desktop.
| #!/bin/sh | |
| # | |
| # Perform certificate updates in Vault. | |
| set -eo pipefail | |
| if ! vault token lookup > /dev/null; then | |
| echo "Login to Vault first." | |
| exit 1 | |
| fi | |
| # Certificate renewal might take some time, | |
| # so renew the token if possible | |
| vault token renew > /dev/null | |
| for domain in $RENEWED_DOMAINS; do | |
| # Wildcard certificates lead to domains like *.example.com | |
| # which should become example.com | |
| target=$domain | |
| case $target in \*\.*) | |
| target=${target#*.} | |
| esac | |
| vault kv put \ | |
| "secret/lets-encrypt/certificates/$target" \ | |
| "cert=@$RENEWED_LINEAGE/cert.pem" \ | |
| "chain=@$RENEWED_LINEAGE/chain.pem" \ | |
| "privkey=@$RENEWED_LINEAGE/privkey.pem" | |
| # In case of a multiple-domain certificate, there is no need to re-run this for next domains | |
| exit 0 | |
| done |
| FROM certbot/dns-dnsimple:v0.33.1 | |
| ARG VAULT_VERSION=1.1.3 | |
| RUN set -eux; \ | |
| apk add --no-cache curl gnupg jq tzdata && \ | |
| apkArch="$(apk --print-arch)"; \ | |
| case "$apkArch" in \ | |
| armhf) ARCH='arm' ;; \ | |
| aarch64) ARCH='arm64' ;; \ | |
| x86_64) ARCH='amd64' ;; \ | |
| x86) ARCH='386' ;; \ | |
| *) echo >&2 "error: unsupported architecture: $apkArch"; exit 1 ;; \ | |
| esac && \ | |
| VAULT_GPGKEY=91A6E7F85D05C65630BEF18951852D87348FFC4C; \ | |
| found=''; \ | |
| for server in \ | |
| hkp://p80.pool.sks-keyservers.net:80 \ | |
| hkp://keyserver.ubuntu.com:80 \ | |
| hkp://pgp.mit.edu:80 \ | |
| ; do \ | |
| echo "Fetching GPG key $VAULT_GPGKEY from $server"; \ | |
| gpg --batch --keyserver "$server" --recv-keys "$VAULT_GPGKEY" && found=yes && break; \ | |
| done; \ | |
| test -z "$found" && echo >&2 "error: failed to fetch GPG key $VAULT_GPGKEY" && exit 1; \ | |
| mkdir -p /tmp/vault && \ | |
| cd /tmp/vault && \ | |
| wget https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_${ARCH}.zip && \ | |
| wget https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_SHA256SUMS && \ | |
| wget https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_SHA256SUMS.sig && \ | |
| gpg --batch --verify vault_${VAULT_VERSION}_SHA256SUMS.sig vault_${VAULT_VERSION}_SHA256SUMS && \ | |
| grep vault_${VAULT_VERSION}_linux_${ARCH}.zip vault_${VAULT_VERSION}_SHA256SUMS | sha256sum -c && \ | |
| unzip -d /bin vault_${VAULT_VERSION}_linux_amd64.zip && \ | |
| cd /tmp && \ | |
| rm -rf /tmp/vault && \ | |
| gpgconf --kill dirmngr && \ | |
| gpgconf --kill gpg-agent && \ | |
| apk del gnupg && \ | |
| rm -rf /root/.gnupg | |
| COPY entrypoint.sh /usr/local/bin/ | |
| COPY initialize.sh /usr/local/bin/ | |
| COPY 00-update-vault.sh /etc/letsencrypt/renewal-hooks/deploy/ |
| #!/bin/sh | |
| set -e | |
| if [ "$1" = 'renew' ]; then | |
| initialize.sh | |
| certbot renew | |
| else | |
| exec "$@" | |
| fi |
| #!/bin/sh | |
| # Initialize the environment for certbot | |
| # Requires vault and jq | |
| set -eo pipefail | |
| if ! vault token lookup > /dev/null; then | |
| echo "Login to Vault first." | |
| exit 1 | |
| fi | |
| # Get account path | |
| ACCOUNT_PARENT_PATH=/etc/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory | |
| ACCOUNT_ID=$(vault kv get --format=json secret/lets-encrypt/account/extra_details | jq -r '.data.data.account_id') | |
| ACCOUNT_PATH="$ACCOUNT_PARENT_PATH/$ACCOUNT_ID" | |
| mkdir -p "$ACCOUNT_PATH" | |
| for i in meta private_key regr; do | |
| vault kv get --format=json "secret/lets-encrypt/account/$i" | \ | |
| jq -c '.data.data' \ | |
| > "$ACCOUNT_PATH/$i.json" | |
| done | |
| echo "dns_dnsimple_token = $(vault kv get --format=json secret/dnsimple | jq -r '.data.data.token')" > /etc/letsencrypt/dnsimple.ini | |
| chmod 600 /etc/letsencrypt/dnsimple.ini | |
| CERTIFICATES_TO_CHECK=$(vault kv list --format=json secret/lets-encrypt/certificates | jq -r '.[]') | |
| mkdir -p /etc/letsencrypt/renewal | |
| for certificate in $CERTIFICATES_TO_CHECK; do | |
| CERTIFICATE_DATA=$(vault kv get --format=json "secret/beyond/lets-encrypt-certificates/certificates/${certificate}") | |
| mkdir -p "/etc/letsencrypt/archive/${certificate}" | |
| mkdir -p "/etc/letsencrypt/live/${certificate}" | |
| for field in cert chain privkey; do | |
| cat > "/etc/letsencrypt/archive/${certificate}/${field}1.pem" <<EOF | |
| $(echo "${CERTIFICATE_DATA}" | jq -r ".data.data.${field}") | |
| EOF | |
| ln \ | |
| -s "../../archive/${certificate}/${field}1.pem" \ | |
| "/etc/letsencrypt/live/${certificate}/${field}.pem" | |
| done | |
| cat \ | |
| "/etc/letsencrypt/archive/${certificate}/cert1.pem" \ | |
| "/etc/letsencrypt/archive/${certificate}/chain1.pem" \ | |
| > "/etc/letsencrypt/archive/${certificate}/fullchain1.pem" | |
| ln \ | |
| -s "../../archive/${certificate}/fullchain1.pem" \ | |
| "/etc/letsencrypt/live/${certificate}/fullchain.pem" | |
| cat > "/etc/letsencrypt/renewal/$certificate.conf" <<EOF | |
| version = 0.33.1 | |
| archive_dir = /etc/letsencrypt/archive/$certificate | |
| cert = /etc/letsencrypt/live/$certificate/cert.pem | |
| privkey = /etc/letsencrypt/live/$certificate/privkey.pem | |
| chain = /etc/letsencrypt/live/$certificate/chain.pem | |
| fullchain = /etc/letsencrypt/live/$certificate/fullchain.pem | |
| # Options used in the renewal process | |
| [renewalparams] | |
| authenticator = dns-dnsimple | |
| account = $ACCOUNT_ID | |
| dns_dnsimple_credentials = /etc/letsencrypt/dnsimple.ini | |
| server = https://acme-v02.api.letsencrypt.org/directory | |
| EOF | |
| done |
https://gist.github.com/teamblack-ci/b853bf2c360f7e528e6b1b0aad9995f6#file-dockerfile-L33
I think this should be:
unzip -d /bin vault_${VAULT_VERSION}_linux_${ARCH}.zip && \
?
https://gist.github.com/teamblack-ci/b853bf2c360f7e528e6b1b0aad9995f6#file-00-update-vault-sh-L25
This should bevault kv putrather thanvault kv get, right?
That's right!
https://gist.github.com/teamblack-ci/b853bf2c360f7e528e6b1b0aad9995f6#file-dockerfile-L33
I think this should be:unzip -d /bin vault_${VAULT_VERSION}_linux_${ARCH}.zip && \?
Another good suggestion. For the time being I have only tested this on amd64, therefore I will leave it so until someone tests this out.
If anyone finds this and chooses to use it Hashicorp has a new GPG key located here: https://www.hashicorp.com/security
In order to start a shell in the container (or any other command as allowed by entrypoint.sh), I had to add this to Dockerfile.
[...]
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
https://gist.github.com/teamblack-ci/b853bf2c360f7e528e6b1b0aad9995f6#file-00-update-vault-sh-L25
This should be
vault kv putrather thanvault kv get, right?