Compare commits

..

11 Commits

Author SHA1 Message Date
51072424ed Apple Touch Icons added 3
All checks were successful
ci/woodpecker/push/build/2 Pipeline was successful
ci/woodpecker/push/build/3 Pipeline was successful
ci/woodpecker/push/predeploy Pipeline was successful
ci/woodpecker/push/build/1 Pipeline was successful
ci/woodpecker/push/build/4 Pipeline was successful
ci/woodpecker/push/deploy/3 Pipeline was successful
ci/woodpecker/push/deploy/1 Pipeline was successful
ci/woodpecker/push/deploy/2 Pipeline was successful
ci/woodpecker/push/deploy/4 Pipeline was successful
ci/woodpecker/tag/predeploy Pipeline was successful
ci/woodpecker/tag/build/4 Pipeline was successful
ci/woodpecker/tag/build/1 Pipeline was successful
ci/woodpecker/tag/build/3 Pipeline was successful
ci/woodpecker/tag/build/2 Pipeline was successful
ci/woodpecker/tag/deploy/2 Pipeline was successful
ci/woodpecker/tag/deploy/1 Pipeline was successful
ci/woodpecker/tag/deploy/3 Pipeline was successful
ci/woodpecker/tag/deploy/4 Pipeline was successful
2025-11-30 17:03:14 +01:00
722f4f0a8c Apple Touch Icons added 2
All checks were successful
ci/woodpecker/push/build/4 Pipeline was successful
ci/woodpecker/push/build/2 Pipeline was successful
ci/woodpecker/push/build/3 Pipeline was successful
ci/woodpecker/push/build/1 Pipeline was successful
ci/woodpecker/push/predeploy Pipeline was successful
ci/woodpecker/push/deploy/2 Pipeline was successful
ci/woodpecker/push/deploy/4 Pipeline was successful
ci/woodpecker/push/deploy/3 Pipeline was successful
ci/woodpecker/push/deploy/1 Pipeline was successful
2025-11-30 16:58:08 +01:00
0acabc737e Apple Touch Icons added
All checks were successful
ci/woodpecker/push/build/4 Pipeline was successful
ci/woodpecker/push/build/2 Pipeline was successful
ci/woodpecker/push/build/1 Pipeline was successful
ci/woodpecker/push/build/3 Pipeline was successful
ci/woodpecker/push/predeploy Pipeline was successful
ci/woodpecker/push/deploy/3 Pipeline was successful
ci/woodpecker/push/deploy/4 Pipeline was successful
ci/woodpecker/push/deploy/2 Pipeline was successful
ci/woodpecker/push/deploy/1 Pipeline was successful
2025-11-30 16:54:47 +01:00
34b0cdef69 encrypted client certificates
All checks were successful
ci/woodpecker/push/build/2 Pipeline was successful
ci/woodpecker/push/predeploy Pipeline was successful
ci/woodpecker/push/build/3 Pipeline was successful
ci/woodpecker/push/build/1 Pipeline was successful
ci/woodpecker/push/build/4 Pipeline was successful
ci/woodpecker/push/deploy/1 Pipeline was successful
ci/woodpecker/push/deploy/4 Pipeline was successful
ci/woodpecker/push/deploy/2 Pipeline was successful
ci/woodpecker/push/deploy/3 Pipeline was successful
2025-11-30 16:24:21 +01:00
68ca51a242 certs scripts 2 2025-11-30 16:06:01 +01:00
6d0f38965d certs scripts 2025-11-30 16:05:41 +01:00
1078e4cd53 password for client cert 2025-11-30 15:59:57 +01:00
0c2f3f2e83 new mtls approach 4
All checks were successful
ci/woodpecker/push/build/4 Pipeline was successful
ci/woodpecker/push/build/3 Pipeline was successful
ci/woodpecker/push/predeploy Pipeline was successful
ci/woodpecker/push/build/1 Pipeline was successful
ci/woodpecker/push/build/2 Pipeline was successful
ci/woodpecker/push/deploy/3 Pipeline was successful
ci/woodpecker/push/deploy/4 Pipeline was successful
ci/woodpecker/push/deploy/1 Pipeline was successful
ci/woodpecker/push/deploy/2 Pipeline was successful
ci/woodpecker/tag/predeploy Pipeline was successful
ci/woodpecker/tag/build/4 Pipeline was successful
ci/woodpecker/tag/build/1 Pipeline was successful
ci/woodpecker/tag/build/2 Pipeline was successful
ci/woodpecker/tag/build/3 Pipeline was successful
ci/woodpecker/tag/deploy/3 Pipeline was successful
ci/woodpecker/tag/deploy/2 Pipeline was successful
ci/woodpecker/tag/deploy/4 Pipeline was successful
ci/woodpecker/tag/deploy/1 Pipeline was successful
2025-11-29 23:09:03 +01:00
418f813e80 new mtls approach 3
All checks were successful
ci/woodpecker/push/build/3 Pipeline was successful
ci/woodpecker/push/predeploy Pipeline was successful
ci/woodpecker/push/build/4 Pipeline was successful
ci/woodpecker/push/build/1 Pipeline was successful
ci/woodpecker/push/build/2 Pipeline was successful
ci/woodpecker/push/deploy/4 Pipeline was successful
ci/woodpecker/push/deploy/2 Pipeline was successful
ci/woodpecker/push/deploy/1 Pipeline was successful
ci/woodpecker/push/deploy/3 Pipeline was successful
2025-11-29 23:07:32 +01:00
2b2fd92923 new mtls approach 2
Some checks failed
ci/woodpecker/push/build/4 Pipeline was successful
ci/woodpecker/push/build/3 Pipeline failed
ci/woodpecker/push/build/2 Pipeline failed
ci/woodpecker/push/predeploy Pipeline failed
ci/woodpecker/push/build/1 Pipeline failed
ci/woodpecker/push/deploy/1 unknown status
ci/woodpecker/push/deploy/2 unknown status
ci/woodpecker/push/deploy/3 unknown status
ci/woodpecker/push/deploy/4 unknown status
ci/woodpecker/tag/predeploy Pipeline was successful
ci/woodpecker/tag/build/1 Pipeline was successful
ci/woodpecker/tag/build/4 Pipeline was successful
ci/woodpecker/tag/build/2 Pipeline was successful
ci/woodpecker/tag/build/3 Pipeline was successful
ci/woodpecker/tag/deploy/3 Pipeline was successful
ci/woodpecker/tag/deploy/2 Pipeline was successful
ci/woodpecker/tag/deploy/1 Pipeline was successful
ci/woodpecker/tag/deploy/4 Pipeline was successful
2025-11-29 22:58:40 +01:00
8fa81be750 new mtls approach
All checks were successful
ci/woodpecker/push/build/1 Pipeline was successful
ci/woodpecker/push/build/4 Pipeline was successful
ci/woodpecker/push/predeploy Pipeline was successful
ci/woodpecker/push/build/3 Pipeline was successful
ci/woodpecker/push/build/2 Pipeline was successful
ci/woodpecker/push/deploy/3 Pipeline was successful
ci/woodpecker/push/deploy/4 Pipeline was successful
ci/woodpecker/push/deploy/2 Pipeline was successful
ci/woodpecker/push/deploy/1 Pipeline was successful
ci/woodpecker/tag/predeploy Pipeline was successful
ci/woodpecker/tag/build/4 Pipeline was successful
ci/woodpecker/tag/build/1 Pipeline was successful
ci/woodpecker/tag/build/3 Pipeline was successful
ci/woodpecker/tag/build/2 Pipeline was successful
ci/woodpecker/tag/deploy/3 Pipeline was successful
ci/woodpecker/tag/deploy/1 Pipeline was successful
ci/woodpecker/tag/deploy/4 Pipeline was successful
ci/woodpecker/tag/deploy/2 Pipeline was successful
2025-11-29 22:55:42 +01:00
20 changed files with 896 additions and 368 deletions

2
.gitignore vendored
View File

@@ -66,3 +66,5 @@ apps/homekit/homekit.state
tools/ca/
tools/clients/
tools/certificates/
tools/certificates.tgz

View File

@@ -33,7 +33,6 @@ steps:
--namespace=$NAMESPACE
--dry-run=client -o yaml | kubectl apply -f -
- kubectl apply -f deployment/configmap.yaml -n $NAMESPACE
- kubectl apply -f deployment/mtls-config.yaml # NO NAMESPACE HERE
when:
event: [tag]

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,4 @@
<svg width="180" height="180" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="180" height="180" rx="40" fill="#667EEA"/>
<text x="90" y="130" font-size="80" text-anchor="middle" fill="white">🏡</text>
</svg>

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,4 @@
<svg width="180" height="180" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="180" height="180" rx="40" fill="#667EEA"/>
<text x="90" y="130" font-size="80" text-anchor="middle" fill="white">🚗</text>
</svg>

After

Width:  |  Height:  |  Size: 244 B

View File

@@ -4,6 +4,13 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Garage - Home Automation</title>
<!-- Apple Touch Icon -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/garage-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/garage-icon.png">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="Garage">
<style>
* {
margin: 0;

View File

@@ -4,6 +4,13 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Räume - Home Automation</title>
<!-- Apple Touch Icon -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/apple-touch-icon.png">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="Home Automation">
<style>
* {
margin: 0;

View File

@@ -100,28 +100,3 @@ spec:
targetPort: 8001
name: http
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-production-http
traefik.ingress.kubernetes.io/router.middlewares: default-mtls-auth@kubernetescrd,default-security-headers@kubernetescrd
traefik.ingress.kubernetes.io/router.tls.options: default-homea2-mtls@kubernetescrd
spec:
tls:
- hosts:
- homea2-api.hottis.de
secretName: homea2-api-cert
rules:
- host: homea2-api.hottis.de
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api
port:
number: 80

View File

@@ -1,130 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
namespace: homea2
labels:
app: api
component: home-automation
spec:
replicas: 1
selector:
matchLabels:
app: api
template:
metadata:
annotations:
reloader.stakater.com/auto: "true"
configmap.reloader.stakater.com/reload: "home-automation-environment,home-automation-config"
labels:
app: api
component: home-automation
spec:
containers:
- name: api
image: %IMAGE%
ports:
- containerPort: 8001
name: http
env:
- name: MQTT_BROKER
valueFrom:
configMapKeyRef:
name: home-automation-environment
key: SHARED_MQTT_BROKER
- name: MQTT_PORT
valueFrom:
configMapKeyRef:
name: home-automation-environment
key: SHARED_MQTT_PORT
- name: REDIS_HOST
valueFrom:
configMapKeyRef:
name: home-automation-environment
key: SHARED_REDIS_HOST
- name: REDIS_PORT
valueFrom:
configMapKeyRef:
name: home-automation-environment
key: SHARED_REDIS_PORT
- name: REDIS_DB
valueFrom:
configMapKeyRef:
name: home-automation-environment
key: SHARED_REDIS_DB
- name: REDIS_CHANNEL
valueFrom:
configMapKeyRef:
name: home-automation-environment
key: API_REDIS_CHANNEL
volumeMounts:
- name: config-volume
mountPath: /app/config
readOnly: true
livenessProbe:
httpGet:
path: /health
port: 8001
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8001
initialDelaySeconds: 5
periodSeconds: 5
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 200m
memory: 256Mi
volumes:
- name: config-volume
configMap:
name: home-automation-config
---
apiVersion: v1
kind: Service
metadata:
name: api
labels:
app: api
component: home-automation
spec:
selector:
app: api
ports:
- port: 80
targetPort: 8001
name: http
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-production-http
traefik.ingress.kubernetes.io/router.middlewares: homea2-mtls-auth@kubernetescrd,homea2-security-headers@kubernetescrd
traefik.ingress.kubernetes.io/router.tls.options: homea2-homea2-mtls@kubernetescrd
# Traefik 2 mTLS Configuration
traefik.ingress.kubernetes.io/router.tls.options: homea2-mtls@kubernetescrd
traefik.ingress.kubernetes.io/router.middlewares: homea2-mtls-auth@kubernetescrd
spec:
tls:
- hosts:
- homea2-api.hottis.de
secretName: homea2-api-cert
rules:
- host: homea2-api.hottis.de
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api
port:
number: 80

62
deployment/ingress.yaml Normal file
View File

@@ -0,0 +1,62 @@
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: homea2-cert
spec:
secretName: homea2-cert
issuerRef:
name: letsencrypt-production-http
kind: ClusterIssuer
commonName: homea2.hottis.de
dnsNames:
- homea2.hottis.de
- homea2-api.hottis.de
---
apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
name: mtls-required
spec:
clientAuth:
clientAuthType: RequireAndVerifyClientCert
secretNames:
- mtls-ca-cert
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ui
spec:
entryPoints:
- websecure
tls:
secretName: homea2-cert
options:
name: mtls-required
namespace: homea2
routes:
- match: Host(`homea2.hottis.de`)
kind: Rule
services:
- name: ui
port: 80
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: api
spec:
entryPoints:
- websecure
tls:
secretName: homea2-cert
options:
name: mtls-required
namespace: homea2
routes:
- match: Host(`homea2-api.hottis.de`)
kind: Rule
services:
- name: api
port: 80

View File

@@ -1,48 +0,0 @@
apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
name: homea2-mtls
namespace: default
spec:
clientAuth:
secretNames:
- mtls-ca-cert
clientAuthType: RequireAndVerifyClientCert
minVersion: "VersionTLS12"
cipherSuites:
- "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
- "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"
- "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
- "TLS_RSA_WITH_AES_256_GCM_SHA384"
- "TLS_RSA_WITH_AES_128_GCM_SHA256"
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: mtls-auth
namespace: default
spec:
headers:
customRequestHeaders:
X-Client-Cert: ""
customResponseHeaders:
X-mTLS-Verified: "true"
# Optional: Add IP whitelist for additional security
# ipWhiteList:
# sourceRange:
# - "10.0.0.0/8"
# - "192.168.0.0/16"
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: security-headers
namespace: default
spec:
headers:
customResponseHeaders:
X-Frame-Options: "SAMEORIGIN"
X-Content-Type-Options: "nosniff"
X-XSS-Protection: "1; mode=block"
Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload"
contentSecurityPolicy: "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'"

View File

@@ -77,28 +77,3 @@ spec:
targetPort: 8002
name: http
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ui-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-production-http
traefik.ingress.kubernetes.io/router.middlewares: default-mtls-auth@kubernetescrd,default-security-headers@kubernetescrd
traefik.ingress.kubernetes.io/router.tls.options: default-homea2-mtls@kubernetescrd
spec:
tls:
- hosts:
- homea2.hottis.de
secretName: homea2-ui-cert
rules:
- host: homea2.hottis.de
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ui
port:
number: 80

View File

@@ -1,104 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
namespace: homea2
labels:
app: ui
component: home-automation
spec:
replicas: 1
selector:
matchLabels:
app: ui
template:
metadata:
annotations:
reloader.stakater.com/auto: "true"
configmap.reloader.stakater.com/reload: "home-automation-environment"
labels:
app: ui
component: home-automation
spec:
containers:
- name: ui
image: %IMAGE%
ports:
- containerPort: 8002
name: http
env:
- name: UI_PORT
valueFrom:
configMapKeyRef:
name: home-automation-environment
key: UI_UI_PORT
- name: API_BASE
valueFrom:
configMapKeyRef:
name: home-automation-environment
key: UI_API_BASE
- name: BASE_PATH
valueFrom:
configMapKeyRef:
name: home-automation-environment
key: UI_BASE_PATH
livenessProbe:
httpGet:
path: /
port: 8002
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 8002
initialDelaySeconds: 5
periodSeconds: 5
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
name: ui
labels:
app: ui
component: home-automation
spec:
selector:
app: ui
ports:
- port: 80
targetPort: 8002
name: http
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ui-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-production-http
traefik.ingress.kubernetes.io/router.middlewares: homea2-mtls-auth@kubernetescrd,homea2-security-headers@kubernetescrd
traefik.ingress.kubernetes.io/router.tls.options: homea2-homea2-mtls@kubernetescrd
spec:
tls:
- hosts:
- homea2.hottis.de
secretName: homea2-ui-cert
rules:
- host: homea2.hottis.de
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ui
port:
number: 80

59
icon-generator.html Normal file
View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html>
<head>
<title>Icon Generator</title>
</head>
<body>
<canvas id="homeCanvas" width="180" height="180" style="border: 1px solid #ccc;"></canvas>
<canvas id="garageCanvas" width="180" height="180" style="border: 1px solid #ccc;"></canvas>
<br><br>
<button onclick="downloadHome()">Download Home Icon</button>
<button onclick="downloadGarage()">Download Garage Icon</button>
<script>
// Home Icon
const homeCanvas = document.getElementById('homeCanvas');
const homeCtx = homeCanvas.getContext('2d');
// Fill background
homeCtx.fillStyle = '#667EEA';
homeCtx.fillRect(0, 0, 180, 180);
// Add house emoji
homeCtx.font = '80px Arial';
homeCtx.fillStyle = 'white';
homeCtx.textAlign = 'center';
homeCtx.textBaseline = 'middle';
homeCtx.fillText('🏡', 90, 90);
// Garage Icon
const garageCanvas = document.getElementById('garageCanvas');
const garageCtx = garageCanvas.getContext('2d');
// Fill background
garageCtx.fillStyle = '#667EEA';
garageCtx.fillRect(0, 0, 180, 180);
// Add car emoji
garageCtx.font = '80px Arial';
garageCtx.fillStyle = 'white';
garageCtx.textAlign = 'center';
garageCtx.textBaseline = 'middle';
garageCtx.fillText('🚗', 90, 90);
function downloadHome() {
const link = document.createElement('a');
link.download = 'apple-touch-icon.png';
link.href = homeCanvas.toDataURL();
link.click();
}
function downloadGarage() {
const link = document.createElement('a');
link.download = 'garage-icon.png';
link.href = garageCanvas.toDataURL();
link.click();
}
</script>
</body>
</html>

693
tools/certificates.asc Normal file
View File

@@ -0,0 +1,693 @@
-----BEGIN PGP MESSAGE-----
jA0ECQMIvcxCfrertFn90v8AAID+ASqxcvgoVWTsLJvACtmb7XYOQWfNQINjnHsz
8mdEMR18Qyj/z981Yo/MgjY4V+jDChHdaTRGNnWkQ08lvGax3pN9NfxTsfc//OoZ
cTxm/VutVyTh5u/kXezTr0RObDZUSIEg0VnoogxFJodPzkQxR/W3sCn+d/GnDROH
udh/MNiS/a5Q9JdNSu9mmMKIrvkdxJn5JplgzrRjXpX3LqxaJwr2jMIz0u1MnsUM
4GqDgof+WYI/fHKUie9dMxQdhYDYOFdCSjEZ2NOPQkID/XCR2tQ/GbrCpCVRUA2Z
tjCk3S0CflVYUyw2yPfVEP6QPGgfWcdjBgdX1reWCYC5sKMnW39k2k9BUfJ9EDNx
jvWwJ82xMwTjCmNzWUTznSP5EX1VEV8IockytkNiqwecwmW9XIkNbw/KN+SOxlfj
4wvOGvueYVUePf+3xveghXwCD7kjGmYkKweU241177suqIRvfGsOiiKSTqVHAfHH
zPvVsz6ix5QPsze0SSPNHFR6025s89OEzdOgjHbTmdVaDsnxdg7NCyGgYpXK0CwY
Dmusoe4dVJzPVBvyGCse8SQ9dFWuR5joa4N2HxgfwO/69kIqmSWWYL4Tvgp1J90i
HcM0xH2QJFQpWEkLkUaxDGrdkSHkzS5kmZpjkbVpf1qihdIfnSENVc/xkZoHgZKx
G2Zp6sVtTdWgYJhF884ygCvXUwlRyYIs+XgVN0zpr2UmWNrGa1WBGdbr62ZcF/DJ
c6aMrpOel6u0GDYsrIsTpiCmD99P/VHYXgxqE80+WL1nJh52PrBy8giqDDl57BSH
aW3xCke0eF7/hrhohHbRM3pIi7700gr3CJU03BqLpaGFLo2YF88L9N+Udylr+bBx
hQG4gqWoKp/lKx+9zn214w/h01FA1c+gbM187JGh5KTYZeIpbftgpC55UH3n/Awy
dL78XRfPm6EDjIhjmD1sNIw6P3wk7YiO58lfT2zLjVM9Pslh7VMUiOWJHcKmY9vP
w5geylCBRqIOXwzcJn0Klu8ZAimG6cUmWgfW/FoStR8iKyAVIgK0bUcc8ItMARlU
933HUrmk/GL9ioEOfdIHwiGdLK8MhbRpZwpgcnTYktZjvatqZlxN/ZVDdoQ6JG1z
Wd3LHk/Q9j7mW+oZb3o32zGfZvAwAPKGcUEEHHtbqW1C4SimzELflH5rfsIL5O2O
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
swNOfIucci2SoV/IhTA+Ljp2YHKlSf4b3U+qPfhOJMvb5lGM26CKx9+DqvXNSWe0
BrrTRAmyT6M1NtIp6IWmr3Pc4hOpfKCSOitYUzy39x977WCvRG+Wn26ftHOr04IU
ziSMZj49i8jHW60jqJ3Ueoz1UHyA6h6i/FBlXlo8GrWvxNT8WBttkOclwUe5AsMS
rtlN/4SVCZ147MmMxn6qnYs6i/V6YasHY3S7mmWqbSa6qRaZ8kmyHrXdNTSHDfZw
ZH5UkdcnjPbDhGFzdXDhxFqRPASuF3UPbI/P7bRFOqyr2iaPYoC0o5JKtKYkr9ly
njdMxUY42IpavLbAtBTr3HwFcUBxqSufxN6osp69b5UJU9bn5lS6XuVx4YbtDa2N
YXU8zE0rLIezOI6Xi5PmoenOACnu2SismLIINyWn+NS6aINVKQSoAyi/30qsdYli
y55B2ixsc3e82AYzDAbqYCS8/Yxkir5SaocVfMryMAkGMbmBnazORPcGOlpb/i6h
KKYKvZiAq23mYkVeFCNjctZb82AMQWWKkTPkEdj3L9mQjvIZOCnMBmZEPxqyTsRn
OLVbl5BtNn9O59Wv7K/Wl5ItUGUIYtBKS3Hr/xAUe7RParzi3uX9G07ZD2+Xka2r
H2SUCsTlUuBvGJT/0BmcumwxYpgF9aypoNdCtvcN9Xp8BMoMPeMvvPIyWCr0DlrF
+85rfl8QJxGlRKibhCfrrfJH7ZL8Xd2ITh/RSjgbaw/SN8ZZnA2IVlKZSCTmKyuW
XnvbH3BmgXPG7L8rKi537a11O9LRduRwZbsqOdAurQk/ehRw6CddV+BRvMmTEW1E
4I04u94tLGw5TLVnademSro1RVzBIb2zfG0C2kP/0V7/yWUaLqNJR5LzCXqDx4BN
FY14IY0A10dOR2PAF4hrXYCMmvc+yJQXnX1OQFIgCuqFugovRKuwxKjVwJlYk+/U
xNx0fPlmtXu4nXuMRbtw5kPXAh/mrMDWVEAULfE0NMDjNhvKeLzYFNp64Om2Yh7j
453j3SBuKL0mZ9pVrwty0hzNwdgfE6mBhu6KPgpDpa2F21wqJlxvcheVGaqEg+iv
JoT5NksEoiur8bEYQj6BNlbfDwQszL47TlnfExoWk41VQtljsMHsqFNevAZLXu78
lTysCe7aHu/tOnp4cN24/U5ZiBtGrBrEvW7fmZlDiZHVPM9+4bBw6b+0gkCLn1cc
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
weJlzvZk7gLaVw6ey1/Io/uNQw==
=7Zeo
-----END PGP MESSAGE-----

View File

@@ -1,17 +1,18 @@
#!/bin/bash
set -e
# Check if client name is provided
if [ $# -eq 0 ]; then
echo "Usage: $0 <client-name>"
echo "Example: $0 john.doe"
# Check if client name and password are provided
if [ $# -lt 2 ]; then
echo "Usage: $0 <client-name> <p12-password>"
echo "Example: $0 john.doe mySecurePassword123"
exit 1
fi
CLIENT_NAME="$1"
P12_PASSWORD="$2"
# Check if CA exists
if [ ! -f "ca/ca.crt" ] || [ ! -f "ca/ca.key" ]; then
if [ ! -f "certificates/ca/ca.crt" ] || [ ! -f "certificates/ca/ca.key" ]; then
echo "Error: CA not found. Please run setup-ca.sh first."
exit 1
fi
@@ -20,54 +21,52 @@ echo "=== Creating Client Certificate ==="
echo "Client Name: $CLIENT_NAME"
# Create client directory
mkdir -p clients/$CLIENT_NAME
mkdir -p certificates/clients/$CLIENT_NAME
# Generate client private key
echo "Generating client private key..."
openssl genrsa -out clients/$CLIENT_NAME/$CLIENT_NAME.key 2048
openssl genrsa -out certificates/clients/$CLIENT_NAME/$CLIENT_NAME.key 2048
# Generate client certificate signing request
echo "Generating client certificate signing request..."
openssl req -new -key clients/$CLIENT_NAME/$CLIENT_NAME.key \
-out clients/$CLIENT_NAME/$CLIENT_NAME.csr \
openssl req -new -key certificates/clients/$CLIENT_NAME/$CLIENT_NAME.key \
-out certificates/clients/$CLIENT_NAME/$CLIENT_NAME.csr \
-subj "/DC=de/DC=hottis/DC=homea2/CN=$CLIENT_NAME"
# Sign the client certificate
echo "Signing client certificate..."
openssl x509 -req -in clients/$CLIENT_NAME/$CLIENT_NAME.csr \
-CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial \
-out clients/$CLIENT_NAME/$CLIENT_NAME.crt \
openssl x509 -req -in certificates/clients/$CLIENT_NAME/$CLIENT_NAME.csr \
-CA certificates/ca/ca.crt -CAkey certificates/ca/ca.key -CAcreateserial \
-out certificates/clients/$CLIENT_NAME/$CLIENT_NAME.crt \
-days 365 -sha256
# Create PKCS#12 bundle
echo "Creating PKCS#12 bundle..."
openssl pkcs12 -export \
-out clients/$CLIENT_NAME/$CLIENT_NAME.p12 \
-inkey clients/$CLIENT_NAME/$CLIENT_NAME.key \
-in clients/$CLIENT_NAME/$CLIENT_NAME.crt \
-certfile ca/ca.crt \
-out certificates/clients/$CLIENT_NAME/$CLIENT_NAME.p12 \
-inkey certificates/clients/$CLIENT_NAME/$CLIENT_NAME.key \
-in certificates/clients/$CLIENT_NAME/$CLIENT_NAME.crt \
-certfile certificates/ca/ca.crt \
-name "$CLIENT_NAME Home Automation Client" \
-passout pass:
-passout pass:$P12_PASSWORD
# Set appropriate permissions
chmod 400 clients/$CLIENT_NAME/$CLIENT_NAME.key
chmod 644 clients/$CLIENT_NAME/$CLIENT_NAME.crt
chmod 644 clients/$CLIENT_NAME/$CLIENT_NAME.p12
chmod 400 certificates/clients/$CLIENT_NAME/$CLIENT_NAME.key
chmod 644 certificates/clients/$CLIENT_NAME/$CLIENT_NAME.crt
chmod 644 certificates/clients/$CLIENT_NAME/$CLIENT_NAME.p12
# Verify client certificate
echo "Verifying client certificate..."
openssl x509 -noout -text -in clients/$CLIENT_NAME/$CLIENT_NAME.crt
openssl x509 -noout -text -in certificates/clients/$CLIENT_NAME/$CLIENT_NAME.crt
echo ""
echo "=== Client Certificate Created ==="
echo "Client Certificate: clients/$CLIENT_NAME/$CLIENT_NAME.crt"
echo "Client Private Key: clients/$CLIENT_NAME/$CLIENT_NAME.key"
echo "PKCS#12 Bundle: clients/$CLIENT_NAME/$CLIENT_NAME.p12"
echo "Client Certificate: certificates/clients/$CLIENT_NAME/$CLIENT_NAME.crt"
echo "Client Private Key: certificates/clients/$CLIENT_NAME/$CLIENT_NAME.key"
echo "PKCS#12 Bundle: certificates/clients/$CLIENT_NAME/$CLIENT_NAME.p12"
echo ""
echo "Installation Instructions:"
echo "1. Import the PKCS#12 file into your browser/application"
echo "2. The bundle contains both the client certificate and CA certificate"
echo "3. No password is set for the PKCS#12 file (you can add one by modifying the -passout parameter)"
echo "3. Password for PKCS#12 file: $P12_PASSWORD"
echo ""
echo "For testing with curl:"
echo "curl --cert clients/$CLIENT_NAME/$CLIENT_NAME.crt --key clients/$CLIENT_NAME/$CLIENT_NAME.key --cacert ca/ca.crt https://homea2.hottis.de/"
echo "curl --cert certificates/clients/$CLIENT_NAME/$CLIENT_NAME.crt --key certificates/clients/$CLIENT_NAME/$CLIENT_NAME.key https://homea2.hottis.de/"

12
tools/decrypt-certificates.sh Executable file
View File

@@ -0,0 +1,12 @@
#!/bin/bash
set -e
gpg --decrypt --pinentry-mode=loopback --output certificates.tgz certificates.asc
tar -xzvf certificates.tgz ./certificates/
rm certificates.tgz

13
tools/encrypt-certificates.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
set -e
tar -czvf certificates.tgz ./certificates/
gpg --symmetric --cipher-algo AES256 --armor --pinentry-mode=loopback --output certificates.asc certificates.tgz
rm certificates.tgz

View File

@@ -4,21 +4,20 @@ set -e
echo "=== mTLS CA Setup ==="
# Create CA directory
mkdir -p ca
mkdir -p certificates/ca
# Generate CA private key
echo "Generating CA private key..."
openssl genrsa -out ca/ca.key 2048
openssl genrsa -out certificates/ca/ca.key 2048
# Generate CA certificate
echo "Generating CA certificate..."
openssl req -new -x509 -days 3650 -key ca/ca.key -out ca/ca.crt \
openssl req -new -x509 -days 3650 -key certificates/ca/ca.key -out certificates/ca/ca.crt \
-subj "/DC=de/DC=hottis/DC=homea2/CN=Home Automation CA"
echo ""
echo "=== CA Setup Complete ==="
echo "CA Certificate: ca/ca.crt"
echo "CA Private Key: ca/ca.key"
echo "CA Certificate: certificates/ca/ca.crt"
echo "CA Private Key: certificates/ca/ca.key"
echo ""
echo "Deploy to Kubernetes:"
echo "kubectl create secret generic mtls-ca-cert --from-file=ca.crt=ca/ca.crt -n homea2"
echo "kubectl create secret generic mtls-ca-cert --from-file=ca.crt=certificates/ca/ca.crt -n homea2"