summaryrefslogtreecommitdiff
path: root/_posts/2019-05-18-auto-letsencrypt-shared.md
blob: 8d2ecd6e6d937acffb59732c87b07477dd665c94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
---
title: Automatisieren von LetsEncrypt-Zertifikatsanforderungen auf einem Shared Hosting über SSH
date: 2019-05-18 16:45 +0200
categories: tech
---

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
~~~~