--- title: Automatisieren von LetsEncrypt-Zertifikatsanforderungen auf einem Shared Hosting über SSH layout: post date: 2019-05-18 16:45 +0200 --- Für dieses Blog nutze ich Zertifikate von [LetsEncrypt](https://letsencrypt.org/){:target="blank"}{:rel="noreferrer"}, die ich mir mittels [Certbot](https://certbot.eff.org/){:target="blank"}{:rel="noreferrer"}, generiere, und anschließend manuell einbinde (da mein Hoster die automatische Generierung von Letsencrypt-Zertifikaten nicht unterstützt). Zumindest die Challenge [(http-01)](https://tools.ietf.org/html/draft-ietf-acme-acme-03#section-7.2){:target="blank"}{:rel="noreferrer"} 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"](https://certbot.eff.org/docs/using.html#pre-and-post-validation-hooks){:target="blank"}{:rel="noreferrer"} mit folgendem Aufruf: ~~~ bash 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: ~~~~ bash #!/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 ~~~~