summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruvok cheetah2019-05-18 16:43:23 +0200
committeruvok cheetah2019-05-18 17:06:36 +0200
commitc171fc63f60c6119a1f4fe75320828550792c1f5 (patch)
tree10887837d3e8e98be2044546f914c7f4e245a0d8
parentf6a89e8943a52b27df37353cf57fe926788f0436 (diff)
Add pot regarding SSH/LetsEncrypt
-rw-r--r--_drafts/test.md7
-rw-r--r--_posts/2019-05-18-auto-letsencrypt-shared.md90
2 files changed, 90 insertions, 7 deletions
diff --git a/_drafts/test.md b/_drafts/test.md
deleted file mode 100644
index 24a3a93..0000000
--- a/_drafts/test.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Trying out unlisted posts
-layout: post
-unlisted: true
----
-
-This is me trying out "private" posts...
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
+~~~~
+
+