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


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