Wiki-Quellcode von LetsEncrypt wwlabs.space
Zuletzt geändert von mirconnect am 2024/04/13 23:22
Zeige letzte Bearbeiter
author | version | line-number | content |
---|---|---|---|
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. |