blob: 371c6986f0b8f3ddd8eb9163d44967c091a9d602 (
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
91
92
|
---
title: Automatisieren von LetsEncrypt-Zertifikatsanforderungen auf einem Shared Hosting über SSH
date: 2019-05-18 16:45 +0200
categories: tech
lang: de
description: "Wie ich Zertifikate bei meinem Hoster mit certbot zumindest automatisiert erstelle. Das Hochladen muss trotzdem manuell erfolgen."
---
Für dieses Blog nutze ich Zertifikate von
[LetsEncrypt](https://letsencrypt.org/),
die ich mir mittels
[Certbot](https://certbot.eff.org/),
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)
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)
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
~~~~
|