> For the complete documentation index, see [llms.txt](https://docs.instantroot.de/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.instantroot.de/kvm-server/linux/ssl-zertifikat-einrichten.md).

# SSL-Zertifikat einrichten

Ein SSL-Zertifikat sorgt dafür, dass eine Webseite verschlüsselt über HTTPS erreichbar ist.

Ohne SSL-Zertifikat wird eine Webseite nur über HTTP ausgeliefert. Moderne Browser markieren solche Webseiten häufig als „Nicht sicher“. Mit HTTPS werden Daten zwischen Besucher und Server verschlüsselt übertragen.

In diesem Artikel erklären wir dir, wie du ein SSL-Zertifikat auf einem KVM-Server einrichtest.

### Voraussetzungen

Du benötigst:

* einen KVM-Server mit Linux
* eine Domain oder Subdomain
* Zugriff per SSH
* einen installierten Webserver, zum Beispiel Apache oder Nginx
* korrekt gesetzte DNS-Einträge
* geöffnete Ports `80` und `443`

Beispiele für Domains:

* `deinedomain.de`
* `www.deinedomain.de`
* `panel.deinedomain.de`
* `api.deinedomain.de`

### Was ist SSL?

SSL wird häufig als allgemeiner Begriff für verschlüsselte Webseiten verwendet.

Technisch wird heute meist TLS verwendet. Im Alltag spricht man aber weiterhin oft von SSL-Zertifikaten.

Ein SSL-Zertifikat bestätigt, dass eine Domain zu einem bestimmten Server gehört und ermöglicht eine verschlüsselte Verbindung.

### Was ist HTTPS?

HTTPS ist die verschlüsselte Variante von HTTP.

| Protokoll | Bedeutung                 |
| --------- | ------------------------- |
| HTTP      | unverschlüsselte Webseite |
| HTTPS     | verschlüsselte Webseite   |

Beispiel ohne SSL:

`http://deinedomain.de`

Beispiel mit SSL:

`https://deinedomain.de`

### DNS prüfen

Bevor du ein SSL-Zertifikat einrichtest, muss deine Domain auf deinen KVM-Server zeigen.

Dafür wird meistens ein A-Record verwendet.

Beispiel:

| Typ | Name  | Ziel                        |
| --- | ----- | --------------------------- |
| A   | `@`   | IPv4-Adresse deines Servers |
| A   | `www` | IPv4-Adresse deines Servers |

Wenn du IPv6 verwendest, kann zusätzlich ein AAAA-Record gesetzt werden.

| Typ  | Name  | Ziel                        |
| ---- | ----- | --------------------------- |
| AAAA | `@`   | IPv6-Adresse deines Servers |
| AAAA | `www` | IPv6-Adresse deines Servers |

DNS-Änderungen sind nicht immer sofort aktiv. Es kann einige Minuten bis mehrere Stunden dauern, bis eine Änderung überall übernommen wurde.

### Ports prüfen

Für die Einrichtung und Nutzung von HTTPS müssen die richtigen Ports erreichbar sein.

| Port  | Zweck |
| ----- | ----- |
| `80`  | HTTP  |
| `443` | HTTPS |

Port `80` wird häufig für die Zertifikatsprüfung benötigt. Port `443` wird für die verschlüsselte Webseite verwendet.

Wenn du eine Firewall nutzt, müssen beide Ports erlaubt sein.

Bei UFW unter Linux:

`ufw allow 80/tcp`

`ufw allow 443/tcp`

Status prüfen:

`ufw status`

### Webserver installieren

Für eine Webseite brauchst du einen Webserver.

Häufig verwendet werden:

* Apache
* Nginx

Du solltest nur einen Webserver für dieselbe Webseite verwenden. Wenn Apache und Nginx gleichzeitig denselben Port nutzen möchten, kann es zu Konflikten kommen.

### Apache installieren

Auf Debian oder Ubuntu kannst du Apache so installieren:

`apt update`

`apt install apache2`

Status prüfen:

`systemctl status apache2`

Apache starten:

`systemctl start apache2`

Apache beim Systemstart aktivieren:

`systemctl enable apache2`

### Nginx installieren

Auf Debian oder Ubuntu kannst du Nginx so installieren:

`apt update`

`apt install nginx`

Status prüfen:

`systemctl status nginx`

Nginx starten:

`systemctl start nginx`

Nginx beim Systemstart aktivieren:

`systemctl enable nginx`

### Certbot installieren

Für kostenlose SSL-Zertifikate wird häufig Let's Encrypt verwendet.

Certbot ist ein Tool, mit dem du Let's-Encrypt-Zertifikate automatisch erstellen und verlängern kannst.

Certbot installieren:

`apt update`

`apt install certbot`

Für Apache zusätzlich:

`apt install python3-certbot-apache`

Für Nginx zusätzlich:

`apt install python3-certbot-nginx`

### SSL-Zertifikat für Apache einrichten

Wenn du Apache verwendest, kannst du Certbot direkt mit dem Apache-Plugin ausführen.

Beispiel für eine Domain:

`certbot --apache -d deinedomain.de`

Beispiel für Domain und www-Subdomain:

`certbot --apache -d deinedomain.de -d www.deinedomain.de`

Während der Einrichtung fragt Certbot einige Angaben ab. Dazu gehören meistens:

* E-Mail-Adresse
* Zustimmung zu den Nutzungsbedingungen
* Auswahl der Weiterleitung von HTTP auf HTTPS

Wenn du gefragt wirst, ob HTTP automatisch auf HTTPS weitergeleitet werden soll, ist die Weiterleitung in den meisten Fällen sinnvoll.

### SSL-Zertifikat für Nginx einrichten

Wenn du Nginx verwendest, kannst du Certbot direkt mit dem Nginx-Plugin ausführen.

Beispiel für eine Domain:

`certbot --nginx -d deinedomain.de`

Beispiel für Domain und www-Subdomain:

`certbot --nginx -d deinedomain.de -d www.deinedomain.de`

Auch hier fragt Certbot nach einigen Angaben und kann die Nginx-Konfiguration automatisch anpassen.

### Zertifikat ohne Webserver-Plugin erstellen

Wenn du kein Apache- oder Nginx-Plugin nutzen möchtest, kannst du ein Zertifikat auch über den Webroot-Modus erstellen.

Beispiel:

`certbot certonly --webroot -w /var/www/html -d deinedomain.de`

Dabei muss der angegebene Webroot zur Domain passen.

Der Webroot ist das Verzeichnis, aus dem dein Webserver die Webseite ausliefert.

Typische Webroots sind:

| Webserver            | Häufiger Webroot                        |
| -------------------- | --------------------------------------- |
| Apache               | `/var/www/html`                         |
| Nginx                | `/var/www/html`                         |
| eigene Konfiguration | abhängig von deiner Serverkonfiguration |

### HTTPS testen

Nach der Einrichtung solltest du deine Webseite im Browser öffnen.

Beispiel:

`https://deinedomain.de`

Prüfe:

* wird die Webseite über HTTPS geladen?
* zeigt der Browser ein Schloss-Symbol?
* gibt es eine Sicherheitswarnung?
* funktioniert auch `https://www.deinedomain.de`, falls eingerichtet?
* leitet HTTP korrekt auf HTTPS weiter?

### HTTP auf HTTPS weiterleiten

Eine Weiterleitung sorgt dafür, dass Besucher automatisch die verschlüsselte Version deiner Webseite verwenden.

Beispiel:

Ein Besucher öffnet:

`http://deinedomain.de`

Der Server leitet weiter auf:

`https://deinedomain.de`

Wenn du Certbot mit Apache oder Nginx verwendest, kann Certbot diese Weiterleitung häufig automatisch einrichten.

### Zertifikat automatisch verlängern

Let's-Encrypt-Zertifikate sind nur für eine begrenzte Zeit gültig.

Certbot richtet normalerweise automatisch eine Verlängerung ein.

Du kannst die automatische Verlängerung testen:

`certbot renew --dry-run`

Wenn dieser Test erfolgreich ist, sollte die automatische Verlängerung funktionieren.

Status der Timer prüfen:

`systemctl list-timers | grep certbot`

Je nach System kann die Verlängerung über systemd oder cron ausgeführt werden.

### Zertifikate anzeigen

Vorhandene Zertifikate kannst du so anzeigen:

`certbot certificates`

Dort siehst du unter anderem:

* Domainnamen
* Ablaufdatum
* Speicherort des Zertifikats
* Speicherort des privaten Schlüssels

### Zertifikat erweitern

Wenn du später eine weitere Domain oder Subdomain hinzufügen möchtest, kannst du das Zertifikat erweitern.

Beispiel:

`certbot --nginx -d deinedomain.de -d www.deinedomain.de -d panel.deinedomain.de`

Bei Apache entsprechend:

`certbot --apache -d deinedomain.de -d www.deinedomain.de -d panel.deinedomain.de`

Achte darauf, dass alle Domains vorher per DNS auf deinen Server zeigen.

### Zertifikat löschen

Wenn ein Zertifikat nicht mehr benötigt wird, kannst du es entfernen.

Zertifikate anzeigen:

`certbot certificates`

Zertifikat löschen:

`certbot delete`

Certbot fragt danach, welches Zertifikat gelöscht werden soll.

Lösche Zertifikate nur, wenn du sicher bist, dass sie nicht mehr verwendet werden.

### Häufige Probleme

#### Domain zeigt nicht auf den Server

Wenn die Domain nicht auf deinen KVM-Server zeigt, kann Let's Encrypt die Domain nicht prüfen.

Prüfe:

* A-Record korrekt gesetzt?
* AAAA-Record korrekt gesetzt, falls IPv6 verwendet wird?
* richtige IP-Adresse eingetragen?
* DNS-Änderung bereits aktiv?
* Domain richtig geschrieben?

#### Port 80 ist nicht erreichbar

Let's Encrypt muss deine Domain häufig über Port `80` prüfen.

Prüfe:

* läuft der Webserver?
* ist Port `80` in der Firewall geöffnet?
* blockiert eine externe Firewall den Zugriff?
* nutzt ein anderer Dienst Port `80`?
* ist die Domain von außen erreichbar?

#### Port 443 ist nicht erreichbar

Wenn Port `443` blockiert ist, funktioniert HTTPS nicht.

Prüfe:

* ist Port `443` in der Firewall geöffnet?
* wurde die Webserver-Konfiguration für HTTPS erstellt?
* läuft Apache oder Nginx?
* wurde der Webserver nach Änderungen neu geladen?

Apache neu laden:

`systemctl reload apache2`

Nginx neu laden:

`systemctl reload nginx`

#### Certbot meldet „unauthorized“

Diese Meldung bedeutet meistens, dass Let's Encrypt deine Domain nicht prüfen konnte.

Mögliche Ursachen:

* Domain zeigt auf falsche IP-Adresse
* Webserver liefert die Prüfdatei nicht aus
* falscher Webroot angegeben
* Port `80` blockiert
* Weiterleitung falsch konfiguriert

#### Certbot meldet „connection refused“

Diese Meldung bedeutet meistens, dass der Server auf Port `80` oder `443` nicht erreichbar ist.

Prüfe Webserver, Firewall und DNS.

#### Certbot meldet „too many certificates“

Let's Encrypt hat Limits für die Ausstellung von Zertifikaten.

Diese Meldung kann auftreten, wenn zu oft Zertifikate für dieselbe Domain beantragt wurden.

Warte in diesem Fall ab und vermeide wiederholte Testversuche mit echten Zertifikaten.

Nutze für Tests nach Möglichkeit:

`certbot renew --dry-run`

#### Browser zeigt „Nicht sicher“

Wenn der Browser weiterhin „Nicht sicher“ anzeigt, kann das mehrere Gründe haben.

Prüfe:

* wird wirklich `https://` verwendet?
* ist das Zertifikat gültig?
* passt das Zertifikat zur Domain?
* ist das Zertifikat abgelaufen?
* werden unsichere Inhalte über HTTP geladen?
* wurde der Webserver neu geladen?

#### Mixed Content

Mixed Content bedeutet, dass eine HTTPS-Seite noch Inhalte über HTTP lädt.

Beispiele:

* Bilder über `http://`
* Skripte über `http://`
* CSS-Dateien über `http://`

Dadurch kann der Browser weiterhin eine Warnung anzeigen.

Lösung:

* interne Links auf `https://` ändern
* CMS-Einstellungen prüfen
* Webseiten-URL auf HTTPS umstellen
* Cache leeren
* externe Ressourcen prüfen

### Unterschied zwischen Domain-Zertifikat und Wildcard-Zertifikat

Ein normales Zertifikat gilt für bestimmte Domains.

Beispiel:

`deinedomain.de`

oder:

`www.deinedomain.de`

Ein Wildcard-Zertifikat gilt für beliebige Subdomains einer Domain.

Beispiel:

`*.deinedomain.de`

Damit wären zum Beispiel abgedeckt:

* `panel.deinedomain.de`
* `api.deinedomain.de`
* `cloud.deinedomain.de`

Wildcard-Zertifikate benötigen meistens eine DNS-Prüfung. Diese ist etwas aufwendiger als die normale HTTP-Prüfung.

### Sicherheit des privaten Schlüssels

Zu jedem Zertifikat gehört ein privater Schlüssel.

Dieser private Schlüssel muss geheim bleiben.

Wenn jemand Zugriff auf den privaten Schlüssel hat, kann die Sicherheit deiner HTTPS-Verbindung gefährdet sein.

Achte deshalb darauf:

* private Schlüssel nicht weitergeben
* keine Zertifikatsdateien öffentlich speichern
* keine Backups im Webverzeichnis ablegen
* Dateirechte prüfen
* Serverzugänge absichern

### Support kontaktieren

Wenn die Einrichtung nicht funktioniert, kontaktiere den Support.

Gib dabei bitte folgende Informationen an:

* betroffene Domain
* verwendeter Webserver: Apache oder Nginx
* Betriebssystem
* genaue Fehlermeldung von Certbot
* ob Port `80` und `443` geöffnet sind
* ob die Domain bereits auf den Server zeigt
* welche Befehle du bereits ausgeführt hast

Sende niemals private Schlüssel, Passwörter oder Zugangsdaten an den Support.
