Wiki-Quellcode von LetsEncrypt wwlabs.space

Zuletzt geändert von mirconnect am 2024/04/13 23:22

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