Für dieses Blog nutze ich Zertifikate von LetsEncrypt, die ich mir mittels Certbot, generiere, und anschließend manuell einbinde (da mein Hoster die automatische Generierung von Letsencrypt-Zertifikaten nicht unterstützt).

Zumindest die Challenge (http-01) konnte ich allerdings automatisieren, sodass ich die Dateien nicht manuell hochladen muss. Ein ssh-Zugang ist erlaubt, diesen nutze ich auch. Das ganze sollte aber auch per ftp funktionieren.

Für die Automatisierung nutze ich die “Pre and Post Validation Hooks” mit folgendem Aufruf:

certbot certonly --manual --preferred-challenges=http \
  --manual-auth-hook "./auth.sh auth" \
  --manual-cleanup-hook "./auth.sh clean" \
  --cert-name my-certificate

Wobei auth.sh wie folgt aussieht:

#!/bin/bash

# Authenticator and cleanup for LetsEncrypt certificates
# https://certbot.eff.org/docs/using.html#pre-and-post-validation-hooks

WEBROOT=/htdocs/
ACMEDIR=.well-known/acme-challenge

if [[ -z $CERTBOT_VALIDATION ]]; then
  echo "Validation string not present"
  exit 1
fi

if [[ -z $CERTBOT_TOKEN ]]; then
  echo "Token name not present"
  exit 1
fi

if [[ -z $CERTBOT_DOMAIN ]]; then
  echo "Domain name not present"
  exit 1
fi

case $CERTBOT_DOMAIN in
  example1.com | example2.com)
    RELPATH=directory1
    ;;
  example3.com)
    RELPATH=directory2
    ;;
 *)
    echo "Domain name not supported"
    exit 1
    ;;
esac

WEBDIR=$WEBROOT/$RELPATH/$ACMEDIR
echo "$CERTBOT_VALIDATION" > $CERTBOT_TOKEN

case $1 in
  auth)
    # authenticator mode
    ssh user@example.com "mkdir -p $WEBDIR"
    scp ./$CERTBOT_TOKEN user@example.com:$WEBDIR/
    rm ./$CERTBOT_TOKEN
    ;;
  clean)
    ssh user@example.com "rm $WEBDIR/$CERTBOT_TOKEN; rmdir $WEBDIR"
    rm ./$CERTBOT_TOKEN
    ;;
  *)
    echo "Mode not supported"
    exit 1
    ;;
esac