summaryrefslogtreecommitdiff
path: root/_posts/2019-05-18-auto-letsencrypt-shared.md
diff options
context:
space:
mode:
Diffstat (limited to '_posts/2019-05-18-auto-letsencrypt-shared.md')
-rw-r--r--_posts/2019-05-18-auto-letsencrypt-shared.md90
1 files changed, 90 insertions, 0 deletions
diff --git a/_posts/2019-05-18-auto-letsencrypt-shared.md b/_posts/2019-05-18-auto-letsencrypt-shared.md
new file mode 100644
index 0000000..e07bda1
--- /dev/null
+++ b/_posts/2019-05-18-auto-letsencrypt-shared.md
@@ -0,0 +1,90 @@
+---
+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
+~~~~
+
+