Let’s Encrypt Zertifikat für FortiGate SSL-VPN, VIPs und Admin-UI

Aus meiner Sicht eines der Highlights von FortiOS 7.0 ist der eingebaute ACME-Client, der es ermöglicht, Let’s Encrypt Zertifikate für die FortiGate auszustellen und automatisch zu aktualisieren. Die Zertifikate können für SSL-VPN, Virtual Servers und für die Admin GUI verwendet werden.


Voraussetzungen

DNS

Der Hostname, für den das Zertifikat ausgestellt wird, muss öffentlich auflösbar sein und auf die FortiGate zeigen.

  • A-Record:
    Verfügt man über eine statische IP Adresse, sollte ein A-Record verwendet werden.
  • CNAME:
    Verfügt man nur über eine dynamische IP Adresse, sollte ein CNAME verwendet werden, der auf den Hostnamen eines DDNS Providers verweist.

Port Konfiguration

Vor der Nutzung des ACME Clients muss der Port (bzw. die Ports) konfiguriert werden, über welches der Client ins Internet kommunizieren soll, z.B. für port1:

config system acme
  set interface "port1"
end

Verbindung zum ACME Server

Standardmäßig verwendet FortiOS den Server acme-v02.api.letsencrypt.org. Per Ping sollte die Erreichbarkeit vor der Erstellung des Zertifikats geprüft werden:

execute ping acme-v02.api.letsencrypt.org
Zertifikatsrequest

Sind alle Voraussetzungen erfüllt, kann der Request an Let’s Encrypt gestellt werden.

config vpn certificate local
  edit "ACME_gateway.domain.com"
    set enroll-protocol acme2
    set acme-domain "gateway.domain.com"
    set acme-email "certadmin@domain.com"
  next
By enabling this feature you declare that you agree to the Terms of Service at https://acme-v02.api.letsencrypt.org/directory
Do you want to continue? (y/n) y
end

Bis das Zertifikat dann fix und fertig in der GUI verfügbar war, hat’s bei mir ca. 2 Minuten gedauert.

Der Status lässt sich während des Vorgangs über die CLI wie folgt prüfen:

get vpn certificate local details ACME_gateway.domain.com

Der Output sieht dann bei erfolgreich signiertem Zertifikat wie folgt aus:

CLI Output
CLI Output

Service Binding

Über die folgenden CLI Befehle lässt sich das fertige Zertifikat an die einzelnen Services binden.

SSL VPN

config vpn ssl settings
  set servercert "ACME_gateway.domain.com"
end

Virtual Server

config firewall vip
  edit <vServer-Name>
    set ssl-certificate "ACME_gateway.domain.com"
  next
end

Admin-UI

config system global
  set admin-server-cert "ACME_gateway.domain.com"
end

Einschränkungen

Zum Zeitpunkt der Beitragserstellung kann das Zertifikat nur für einen Hostnamen oder für eine Wildcard-Domain ausgestellt. Mehrere SANs in einem Zertifikat sind nicht möglich.
Das kann an mehreren Stellen zu Problemen führen:

  • SSL-VPN:
    Beim SSL-VPN hat man die Möglichkeit, mehrere Portale mittels Realms zu betreiben. Standardmäßig lauten die URLs dann https://<Host/Domain>/<Realm-Name>. Das lässt sich aber ändern, sodass jeder Realm mit einer eigenen Host/Domain-URL aufrufbar ist.
    z.B.:
    https://gateway.domain.com/sales wird zu https://gw-sales.domain.com/
    https://gateway.domain.com/support wird zu https://gw-support.domain.com/
    Hier funktionert nur ein Wildcard Zertifikat, welches jedoch zumindet in FortiOS 7.0.x nicht unterstützt wird.
    Noch schlecher ist, wenn für einen Realm ein Virtual Hostname konfiguriert ist, z.B.:
    https://gateway.domain.com/sales wird zu https://gateway.sales-domain.com/
    https://gateway.domain.com/support wird zu https://gateway.support-domain.com/
    In diesem Fall kann kein passendes Zertifikat ausgestellt werden.
  • Virtual Server
    Bei Virtual Servern, die ein Host-Header basiertes Loadbalancing machen (also eine VIP, die je nach Host-Header an den passenden Real Server weiterleitet) verhält es sich ähnlich, wie beim SSL-VPN. Das funktioniert nur für eine Domain mit mehreren Hosts per Wildcard-Zertifikat.

Feature verfügbar ab:
FortiOS 7.0

4 Antworten

  1. Gerald sagt:

    Vielen Dank für den Artikel.
    alllerdings sagt
    https://docs.fortinet.com/document/fortigate/7.0.0/new-features/822087/acme-certificate-support

    The configured ACME interface must be public facing so that the FortiGate can listen for ACME update requests. It must not have any VIPs, or port forwarding on port 80 (HTTP) or 443 (HTTPS).

    We kann ich dann eine VIP für ACME-Certificates verwenden?

    • Hallo Gerald
      Ich bin nicht sicher, ob ich deine Frage richtig verstehe, aber gehe mal davon aus, dass du eine VIP per HTTPS mit einem ACME-Zertifikat verwenden möchtest. Wie du selbst geschrieben hast, geht das laut Fortinet eigentlich nur, wenn die VIP einen anderen Port als 80 oder 443 verwendet (also z.B. 8443).
      Ich bin mir aber auch nicht sicher, ob der Artikel von Fortinet so 100%ig stimmt, da Let’s Encrypt eigentlich nur Port 80 Inbound benötigt. Zudem habe ich SSL-VPN auf Port 443 getestet (Port 443 ist damit also „belegt“) und das Let’s Encrypt Zertifikat wird trotzdem problemlos erstellt und erneuert.
      Gruß
      Andreas

  2. Maximilian Koch sagt:

    Hallo,
    erstmal vielen Dank für den Artikel, hat mich schonmal weitergebracht.
    Hier wird beschrieben, dass ein Wildcard möglich ist (was für unsere Zwecke perfekt wäre).
    Fortinet schreibt: The Subject Alternative Name (SAN) field is automatically filled with the FortiGate DNS hostname. It cannot be edited, wildcards cannot be used, and multiple SANs cannot be added.

    Jetzt wäre die Frage kann man mit FortiOS ein LE Wildcard erstellen und nutzen oder nicht ?

    • Hallo
      Danke für deinen Kommentar. Du hast Recht, die Formulierung in meinem Beitrag hat suggeriert, dass Wildcard Zertifikate erstellt werden können. Das geht defacto aktuell nicht, daher habe ich die Formulierung auch etwas angepasst.
      Gruß
      Andreas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.