ACME implementieren
Vorwort
Es gibt zahlreiche Möglichketen das ACME-Protokoll auf einem Server zu verwenden.An dieser Stelle möchten wir Ihnen einzelne Implementierungsbeispiele geben.
Voraussetzungen:
Eine öffentliche IP
Extern auflösbarer DNS-Record für die Domain
Firewall-Regel: Externe Requests auf Port 80/TCP sind gestattet
Benötigte Daten
Im wesentlichen werden drei Parameter benötigt, um ein Zertifikat via ACME abrufen zu können:Die ACME-URL: https://acme.sectigo.com/v2/OV
Ihre Account-ID bzw. Key-ID
Ihr HMAC Key
Ihre Key-ID und der HMAC Key ist in der ACME-Accountverwaltung hinterlegt.
Behandeln Sie diese Daten vertraulich und melden Sie Kompromittierungen sofort.
In den folgenden Beispielen wird die Key-ID "hldhsflhgafosh97454" und der HMAC Key "vHXYm8GopYPw-FDacZvdBckZPhLnMSw8CLSyJ_gvNusfwvPRQ6wyHwAyxCnJ6crcKCds5BQXoxcdVxmFHK" verwendet.
Einzelner Server via Certbot
Installieren Sie zunächst Certbot auf Ihrem Server. Je nach verwendeter Software und Betriebssystem stehen verschiedene Anleitungen zur Verfügung:https://certbot.eff.org/instructions
Danach kann folgender Befehl verwendet werden, um ein einzelnes Zertifikat für die Seite example.fernuni-hagen.de zu erstellen:
certbot certonly --standalone --non-interactive --agree-tos --email domain@fernuni-hagen.de --server https://acme.sectigo.com/v2/OV --eab-kid hldhsflhgafosh97454 --eab-hmac-key vHXYm8GopYPw-FDacZvdBckZPhLnMSw8CLSyJ_gvNusfwvPRQ6wyHwAyxCnJ6crcKCds5BQXoxcdVxmFHK --domain example.fernuni-hagen.de --cert-name example.fernuni-hagen.de
Das Zertifikat, die Chain und der private Schlüssel werden im Ordner
/etc/letsencrypt/live/example.fernuni-hagen.de/ gespeichert.
Für den automatischen Renew sollten entsprechende CronJobs angelegt werden.
Wichtig: Bei dem oben genannten Befehl darf kein Dienst auf dem System den Port 80/tcp verwenden. Certbot bietet jedoch Integrationen für verbreitete Webserver (NGINX, Apache, ...)
Kubernetes-Cluster via Cert-Manager
Cert-Manager ist eine Möglichkeit ACME in Kubernetes zu verwenden. Cert-Manager kümmert sich dabei vollständig um den Lebenszyklus des Zertifikats und erneuert dieses automatisch.Installation:
Dokumentation: https://cert-manager.io/docs/installation/
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.0/cert-manager.yaml
Issuer anlegen
Als erstes muss der ACME-Account als Issuer angelegt werden und der HMAC key als Kubernetes Secret. Issuer und Secret sind in einem Namespace gültig.
Secret:
kubectl create secret generic sectigo-hmac --from-literal secret=vHXYm8GopYPw-FDacZvdBckZPhLnMSw8CLSyJ_gvNusfwvPRQ6wyHwAyxCnJ6crcKCds5BQXoxcdVxmFHK -n default
Issuer:
apiVersion: cert-manager.io/vl
kind: Issuer
metadata:
name: sectigo-issuer # The name of an Issuer
namespace: default
spec:
acme:
email: myemail@sectigo.com # A valid email address
# for certificate expiry alerts
server: https://acme.demo.sectigo.com # The ACME server URL
externalAccountBinding:
keyID: hldhsflhgafosh97454
keySecretRef:
name: sectigo-hmac # The name of the Kubernetes Secret
# created with your HMAC
key: secret
privateKeySecretRef:
name: sectigo-issuer-account-key # The private key created by Cert-Manager
solvers:
- http01:
ingress:
class: nginx
kind: Issuer
metadata:
name: sectigo-issuer # The name of an Issuer
namespace: default
spec:
acme:
email: myemail@sectigo.com # A valid email address
# for certificate expiry alerts
server: https://acme.demo.sectigo.com # The ACME server URL
externalAccountBinding:
keyID: hldhsflhgafosh97454
keySecretRef:
name: sectigo-hmac # The name of the Kubernetes Secret
# created with your HMAC
key: secret
privateKeySecretRef:
name: sectigo-issuer-account-key # The private key created by Cert-Manager
solvers:
- http01:
ingress:
class: nginx
Zertifikat erstellen
Im Zertifikat wird auf den Issuer referenziert:
apiVersion: cert-manager.io/vl
kind: Certificate
metadata:
name: example.fernuni-hagen.de
namespace: defaull
spec:
secretName: study-candidate-swagger-tls
issuerRef:
name: sectigo-issuer
kind: Issuer
dnsNames:
- example.fernuni-hagen.de
kind: Certificate
metadata:
name: example.fernuni-hagen.de
namespace: defaull
spec:
secretName: study-candidate-swagger-tls
issuerRef:
name: sectigo-issuer
kind: Issuer
dnsNames:
- example.fernuni-hagen.de
Der private und public key werden als Secret zu Verfügung gestellt, welches in die Pods gemountet werden kann.
ClusterIssuer verwenden
Um einen Issuer Cluster-weit zu verwenden muss das Secret für den HMAC Key in den Namespace cert-manager deployed werden und vom Typ ClusterIssuer, statt Issuer angelegt werden.
Beim Zertifikat muss spec.issuerRef.kind: ClusterIssuer gesetzt werden.
Weitere Use-Cases
Für weitere Use-Cases können die Dokumentationen von Sectigo und Cert-Manager verwendet werden:Sectigo
Cert-Manager