Wiki-Quellcode von letsencrypt-wwlabs.space
Version 1.1 von loppermann am 2024/04/07 10:32
Zeige letzte Bearbeiter
author | version | line-number | content |
---|---|---|---|
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. |