add self-signed TLS for *.homelab.fhirworx.io
Some checks failed
ci/woodpecker/push/infra-ci Pipeline was successful
ci/woodpecker/push/deploy Pipeline failed
coverage 99% coverage
ci/woodpecker/push/ci Pipeline was successful

Browser (Firefox) auto-upgrades to HTTPS on .io domains. Without a
cert, Traefik accepted the TCP connection on :443 but couldn't do
TLS handshake, causing a blank page.

- Generate 10-year self-signed wildcard cert for *.homelab.fhirworx.io
- Mount certs into Traefik container
- Add TLS routers (websecure entrypoint) mirroring all HTTP routers
- Add traefik/dynamic/tls.yml with default certificate store

Import ~/homelab-ca.crt into Firefox: Settings → Privacy → Certificates
→ Authorities → Import → Trust for websites.
This commit is contained in:
kert
2026-03-21 16:21:24 -04:00
parent 48a1b6f086
commit 7e17ce0a2f
5 changed files with 92 additions and 0 deletions

View File

@@ -35,6 +35,7 @@ services:
volumes: volumes:
- ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro - ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro
- ./traefik/dynamic:/etc/traefik/dynamic:ro - ./traefik/dynamic:/etc/traefik/dynamic:ro
- ./traefik/certs:/etc/traefik/certs:ro
- ./traefik/plugins:/plugins-local:ro - ./traefik/plugins:/plugins-local:ro
environment: environment:
- DOMAIN=${DOMAIN:-homelab.fhirworx.io} - DOMAIN=${DOMAIN:-homelab.fhirworx.io}

20
traefik/certs/homelab.crt Normal file
View File

@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIUKMP/c0vrAZp+UTKNAu4cUYUzl64wDQYJKoZIhvcNAQEL
BQAwIDEeMBwGA1UEAwwVKi5ob21lbGFiLmZoaXJ3b3J4LmlvMB4XDTI2MDMyMTIw
MjAwN1oXDTM2MDMxODIwMjAwN1owIDEeMBwGA1UEAwwVKi5ob21lbGFiLmZoaXJ3
b3J4LmlvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA19ujW/VKqeqY
jBbjcKa2jUSz5VY+3H3R0G1si2e9x9tICgy2bC738YYTphl1ScjPBQJtFkjJEmcg
CeIGNBXM03mGgfagb7VhPN8KdRrOKu4x/FCmCeRjit1haMniQRIdo5VfbQRvzH30
zik5pAmezizEOfSrQlU26u3pGga30YaZoKd32/WJ2JDo80sNWfAZd7jDx/ND97bw
T1KM9aK/JCjEQkuvtScUX4YbQylWYye5fikRpEgyqRN98i1a3eFgTbd+yWFTTSPg
29/FaCAe+LKHCcFo2jaNtSLk9bK9fGyCKkjaRhVWgHChHQ8uzO9yzRM4g81u7YdN
Oa0lZs9LpQIDAQABo4GLMIGIMB0GA1UdDgQWBBSgCqYJcKDdr6kp6Ltf7GBGLNB7
xTAfBgNVHSMEGDAWgBSgCqYJcKDdr6kp6Ltf7GBGLNB7xTAPBgNVHRMBAf8EBTAD
AQH/MDUGA1UdEQQuMCyCFSouaG9tZWxhYi5maGlyd29yeC5pb4ITaG9tZWxhYi5m
aGlyd29yeC5pbzANBgkqhkiG9w0BAQsFAAOCAQEAb1OzTg2sRJTOmhgL/QSDiud+
nDVCSRy9PzZzU8uoxruA68Pgnc21HnEwfd7vHGR58uE4ZNaRWz1LqX78BN8u3Xbx
ZiS8zZAg+z+Xwxi6iNk9CFRVq+vUah/Fdm4bolGpUtKIaO79gxeNB+px16mFokAu
biTIxwaFXSL/PnKLNCdILcH/iSmvYxSyZVPl7sI9cepyevu8yqZfvQzhOAt1G0mB
gbkkyNYJKZ3nnrpL4IxOdooD64kn0D3Bc3GDnWBE8gYTI7JW2Upv/LqIvP0NNUxn
SShTkrTUVLu+/Dpzcj+gtaXV218s+/TORpndGOArtszF3ZK7cQba+M+R7bX55g==
-----END CERTIFICATE-----

28
traefik/certs/homelab.key Normal file
View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDX26Nb9Uqp6piM
FuNwpraNRLPlVj7cfdHQbWyLZ73H20gKDLZsLvfxhhOmGXVJyM8FAm0WSMkSZyAJ
4gY0FczTeYaB9qBvtWE83wp1Gs4q7jH8UKYJ5GOK3WFoyeJBEh2jlV9tBG/MffTO
KTmkCZ7OLMQ59KtCVTbq7ekaBrfRhpmgp3fb9YnYkOjzSw1Z8Bl3uMPH80P3tvBP
Uoz1or8kKMRCS6+1JxRfhhtDKVZjJ7l+KRGkSDKpE33yLVrd4WBNt37JYVNNI+Db
38VoIB74socJwWjaNo21IuT1sr18bIIqSNpGFVaAcKEdDy7M73LNEziDzW7th005
rSVmz0ulAgMBAAECggEAE1KylEW1IHI2cK5cP6MOfj8gGYLeD4MZEd7rYHlYPriH
Aa5/2aReU4BTAin1dJyL+uDr0gEqNFvUVuSLjwSqkf3ArqHcwwZwhQn0V8vr/vs7
fa12ITZd1AcB55o27YGvjIuPf/6HLlee+NUtt0NmZ2kQS2qqUAuGMunUPAO0JDna
joLEm0fgWkiJXq7V8pEg3bn8GSWiMxnZeA6EYJT1CG90tDpLUc4f4qPvjWVetW4m
vlq0cB6JoE3cB5woQSaR/aCHX0D3Pbhz7UiIcmstQ6mwe5hnogO6VmsRAVjOIrph
Qn7qpI4yKxKezOMIM1Dh2EGYVgVhlP8wN1pzX/1A+wKBgQD0qgMn/PxAAHE00B16
dGj25BYc/ih5r19TXAp6hgJfFWaWL60ESrFNGXKAxa67/PJoWGth8ev842zqkfj9
Yg5S09yceyXnBFjJnjSkuY8QK0ZLEZKHcK8UosWR1Y/bBOS+JL5raQLdC4vDlWiz
DQTiUeroAK1v3jjxS0K8C8elWwKBgQDh2/PyeFniXyXFaGFa/6Unv+JwDdh8Sk3A
rMicBDJ8WgSpiHoGupQTTFDMkMl0EJ4mR3Bjvzvh5tGyBvKLxuLdU/lBOUAOr3uC
cK5LWNeqibpNODBqT5tP33RBJHtiQPrq5wkozXmUyG1XxHXP7iz4tobsG/JW+FZb
ZshxGEqi/wKBgQDSds1wQLfddoProns5M5p3h41eM2QuCSY/VxXMgCraEFbHKwvy
fS433IQbMfI11EnSaP02rB0M1baDsj41+XvI1GcaVPUt3RdjmKxAZz8h8ZfuS5d4
2v5BCiRaZxPwnC0JRCJp01ObQqtf+86s964T4dPo72xCpy7kopEtohSDsQKBgQCo
r3EkD/T52BxKsum7YCHGbU6+Z+je81Pc6m8t7wiRzV2cDP0uV11OiHn0PtLm555m
coajSOl9j7nf38Z41MMNkLEhoJOSJEf3pRbX2XPBv/mvwJ6QWAJkhjy6hnfMa0G7
/W/e1I/QqlzX5zgiYv2diB1+7GRzxighPcPIi976mwKBgAmFsr+8G9Rtz891Em+w
D8dPFAdZYBg9aSSYjJd7+22l5CWf40DYcdlU34JfK3mT8s17UMGfBYJnA8IHLfJ9
cHn9y6HInuxs1bydNplRCGJjLNBWTyXNZeCUNAosn9vSM7r6/TAidtQHEupWmniE
K3vJ+OiqlumDDbQ1A12tf4EW
-----END PRIVATE KEY-----

View File

@@ -65,6 +65,18 @@ http:
- {{ . }} - {{ . }}
{{- end }} {{- end }}
{{- end }} {{- end }}
{{ $name }}-tls:
rule: "Host(`{{ get $svc "subdomain" | default $name }}.{{ $domain }}`){{ range get $svc "extra_hosts" | default list }} || Host(`{{ . }}`){{ end }}"
service: {{ $name }}
entryPoints:
- websecure
tls: {}
{{- if $mwList }}
middlewares:
{{- range $mwList }}
- {{ . }}
{{- end }}
{{- end }}
{{- end }} {{- end }}
{{- range $name, $svc := $multi }} {{- range $name, $svc := $multi }}
{{ $name }}: {{ $name }}:
@@ -82,6 +94,18 @@ http:
- {{ . }} - {{ . }}
{{- end }} {{- end }}
{{- end }} {{- end }}
{{ $name }}-tls:
rule: "Host(`{{ get $svc "subdomain" }}.{{ $domain }}`)"
service: {{ $name }}
entryPoints:
- websecure
tls: {}
{{- if $mwList }}
middlewares:
{{- range $mwList }}
- {{ . }}
{{- end }}
{{- end }}
{{- end }} {{- end }}
traefik-dashboard: traefik-dashboard:
rule: "Host(`traefik.{{ $domain }}`)" rule: "Host(`traefik.{{ $domain }}`)"
@@ -92,6 +116,16 @@ http:
- inject-loch - inject-loch
- local-only - local-only
- infra-headers - infra-headers
traefik-dashboard-tls:
rule: "Host(`traefik.{{ $domain }}`)"
service: api@internal
entryPoints:
- websecure
tls: {}
middlewares:
- inject-loch
- local-only
- infra-headers
services: services:
{{- range $name, $svc := $reef }} {{- range $name, $svc := $reef }}
{{ $name }}: {{ $name }}:

9
traefik/dynamic/tls.yml Normal file
View File

@@ -0,0 +1,9 @@
tls:
certificates:
- certFile: /etc/traefik/certs/homelab.crt
keyFile: /etc/traefik/certs/homelab.key
stores:
default:
defaultCertificate:
certFile: /etc/traefik/certs/homelab.crt
keyFile: /etc/traefik/certs/homelab.key