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


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


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



Sonstiges

Ansible Collection für ACME