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:
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 unter https://certbot.eff.org/instructions zur Verfügung.Verwenden Sie einen Apache oder Nginx Webserver unter RHEL 8, so kann Certbot wie folgt installiert werden:
Stellen Sie sicher, dass Ihr System auf dem aktuellen Stand ist:
# dnf update -y
Installieren Sie das Epel repository:
# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
Certbot mit Apache- oder Nginx-Plugin installieren:
Für Apache:
# dnf install certbot python3-certbot-apache
Für Nginx:
# dnf install certbot python3-certbot-nginx
Nach der Installation kann die Version geprüft werden:
# certbot --version
Beispiele zur Verwendung:
Nach der Installation von Certbot kann folgender Befehl verwendet werden, um ein neues Zertifikat zu beantragen und automatisch in die SSL-Konfiguration einzubinden (für Nginx das "--apache" durch "--nginx" ersetzen):
# certbot --apache --agree-tos --rsa-key-size 4096 --email example@fernuni-hagen.de --server https://acme.sectigo.com/v2/OV --eab-kid hldhsflhgafosh97454 --eab-hmac-key vHXYm8GopYPw-FDacZvdBckZPhLnMSw8CLSyJ_gvNusfwvPRQ6wyHwAyxCnJ6crcKCds5BQXoxcdVxmFHK
Certbot listet dabei alle konfigurierten VirtualHosts auf und fragt, für welche Domain das Zertifikat erneuert werden soll.
Möchten Sie das neue Zertifikat lieber manuell in Ihre Konfiguration einbinden, so erweitern Sie das Kommando bitte um "certonly" (für Nginx das "--apache" durch "--nginx" ersetzen):
# certbot certonly --apache --agree-tos --rsa-key-size 4096 --email example@fernuni-hagen.de --server https://acme.sectigo.com/v2/OV --eab-kid hldhsflhgafosh97454 --eab-hmac-key vHXYm8GopYPw-FDacZvdBckZPhLnMSw8CLSyJ_gvNusfwvPRQ6wyHwAyxCnJ6crcKCds5BQXoxcdVxmFHK
Natürlich können Sie auch den Domainnamen direkt mit angeben, hier "example.fernuni-hagen.de":
# certbot certonly --apache --agree-tos --rsa-key-size 4096 --email example@fernuni-hagen.de --server https://acme.sectigo.com/v2/OV --eab-kid hldhsflhgafosh97454 --eab-hmac-key vHXYm8GopYPw-FDacZvdBckZPhLnMSw8CLSyJ_gvNusfwvPRQ6wyHwAyxCnJ6crcKCds5BQXoxcdVxmFHK --domain example.fernuni-hagen.de
Das Zertifikat, die Chain und der private Schlüssel werden im Ordner
/etc/letsencrypt/live/domainname/ gespeichert.
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