Skip to content

Instantly share code, notes, and snippets.

@killbus
Forked from teamblack-ci/00-update-vault.sh
Created April 4, 2023 20:27
Show Gist options
  • Select an option

  • Save killbus/4f856dab1ba8b553be6ddbdaba2334d0 to your computer and use it in GitHub Desktop.

Select an option

Save killbus/4f856dab1ba8b553be6ddbdaba2334d0 to your computer and use it in GitHub Desktop.

Revisions

  1. @teamblack-ci teamblack-ci revised this gist Dec 2, 2020. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion 00-update-vault.sh
    Original file line number Diff line number Diff line change
    @@ -22,7 +22,7 @@ for domain in $RENEWED_DOMAINS; do
    target=${target#*.}
    esac

    vault kv get \
    vault kv put \
    "secret/lets-encrypt/certificates/$target" \
    "cert=@$RENEWED_LINEAGE/cert.pem" \
    "chain=@$RENEWED_LINEAGE/chain.pem" \
  2. @teamblack-ci teamblack-ci created this gist Aug 19, 2019.
    33 changes: 33 additions & 0 deletions 00-update-vault.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,33 @@
    #!/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 get \
    "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
    43 changes: 43 additions & 0 deletions Dockerfile
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,43 @@
    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/
    9 changes: 9 additions & 0 deletions entrypoint.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,9 @@
    #!/bin/sh
    set -e

    if [ "$1" = 'renew' ]; then
    initialize.sh
    certbot renew
    else
    exec "$@"
    fi
    67 changes: 67 additions & 0 deletions initialize.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,67 @@
    #!/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