Wiki-Quellcode von letsencrypt-wwlabs.space

Version 1.1 von loppermann am 2024/04/07 10:32

Zeige letzte Bearbeiter
1 # LetsEncrypt wwlabs.sapce
2
3 Um Space-interne Dienste mit TLS anbieten zu können - nicht weil es wirklich sicher wäre, aber wegen HTTPS per Default und so -
4 gibt es ein wildcard LetsEncrypt Zertifikat für `*.wwlabs.space`.
5 Der Private-Key ist nicht wirklich private, sondern nur Space-private: Für Space-interne Projekt kann man ihn bekommen.
6
7 ## Wie komme ich an das aktuelle Zertifikat
8 Einfach: `curl https://cert.wwlabs.space/letsencrypt/fullchain.pem`
9
10 Originell: `openssl s_client -showcerts wwlabs.space:443 </dev/null 2>/dev/null | sed -n '/^-----BEGIN CERT/,/^-----END CERT/p'`
11
12 ## Setup des Certbots
13 Wir nehmen dafür die Hetzner DNS API, da `wwlabs.space` sowieso im Hetzner-DNS liegt.
14 Die Scripte sind zu 'nem guten Teil aus dem [Hetzner Tutorial](https://community.hetzner.com/tutorials/letsencrypt-dns) geklaut, aber ein bisschen angepasst:
15
16 `/usr/local/bin/certbot-hetzner-auth.sh`
17 ```sh
18 #/bin/bash
19
20 token=$(cat /etc/hetzner-dns-token)
21
22 zone_id=$(curl \
23 -s \
24 -H "Auth-API-Token: ${token}" \
25 "https://dns.hetzner.com/api/v1/zones?search_name=${CERTBOT_DOMAIN}" | \
26 jq ".\"zones\"[] | select(.name == \"${CERTBOT_DOMAIN}\") | .id" 2>/dev/null | tr -d '"')
27
28 curl -X "POST" "https://dns.hetzner.com/api/v1/records" \
29 -s \
30 -H 'Content-Type: application/json' \
31 -H "Auth-API-Token: ${token}" \
32 -d "{ \"value\": \"${CERTBOT_VALIDATION}\", \"ttl\": 600, \"type\": \"TXT\", \"name\": \"_acme-challenge\", \"zone_id\": \"${zone_id}\" }" > /dev/null 2>/dev/null
33
34 # await the entry being present
35 timeout=60
36 while [ $timeout -gt 0 ]; do
37 echo awaiting TXT record...
38 if dig TXT _acme-challenge.${CERTBOT_DOMAIN} @oxygen.ns.hetzner.com | grep "${CERTBOT_VALIDATION}"; then
39 echo matching TXT record found
40 exit 0
41 else
42 timeout=$(($timeout -1))
43 sleep 1
44 fi
45 done
46 echo TXT record not found after 60 seconds.
47 exit 1
48 ```
49
50 `/usr/local/bin/certbot-hetzner-cleanup.sh`
51 ```sh
52 #/bin/bash
53
54 token=$(cat /etc/hetzner-dns-token)
55
56 zone_id=$(curl -s \
57 -H "Auth-API-Token: ${token}" \
58 "https://dns.hetzner.com/api/v1/zones?search_name=${CERTBOT_DOMAIN}" | \
59 jq ".\"zones\"[] | select(.name == \"${CERTBOT_DOMAIN}\") | .id" 2>/dev/null | tr -d '"')
60
61 record_ids=$(curl -s \
62 -H "Auth-API-Token: $token" \
63 "https://dns.hetzner.com/api/v1/records?zone_id=$zone_id" | \
64 jq ".\"records\"[] | select(.name == \"_acme-challenge\") | .id" 2>/dev/null | tr -d '"')
65
66 for record_id in $record_ids
67 do
68 curl -H "Auth-API-Token: $token" \
69 -X "DELETE" "https://dns.hetzner.com/api/v1/records/${record_id}" > /dev/null 2> /dev/null
70 done
71 ```
72
73 `/usr/local/bin/certbot-wwlabs.space-deploy.sh`
74 ```
75 #!/bin/bash
76 if [ "$RENEWED_LINEAGE" = "/etc/letsencrypt/live/wwlabs.space" ]; then
77 cp /etc/letsencrypt/live/wwlabs.space/fullchain.pem /var/www/wwlabs.space/letsencrypt/
78 chmod 644 /var/www/wwlabs.space/letsencrypt/fullchain.pem
79 fi
80 ```
81
82 Und zu guter Letzt:
83 `certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /usr/local/bin/certbot-hetzner-auth.sh --manual-cleanup-hook /usr/local/bin/certbot-hetzner-cleanup.sh -d wwlabs.space -d *.wwlabs.space`
84
85 Damit man den Private-Key nicht andauernd neu verteilen muss, wird in der `/etc/letsencrypt/renewal/wwlabs.space.conf` noch in den `renewalparams` `reuse-key = true` gesetzt.
86 Außerdem wird das deploy Script mit `deploy-hook = /usr/local/bin/certbot-wwlabs.space-deploy.sh` gesetzt.