Mittlerweile gehört ein TLS-Zertifikat für einen Webserver zum guten Ton und kann als Standard angesehen werden. Wie mit einem solchen Zertifikat HTTPS unter Apache und Ubuntu konfiguriert werden kann, zeige ich in diesem Artikel. Wir erstellen dafür ein SAN-Zertifikat und nutzen das Kommandozeilentool OpenSSL.
Inhaltsverzeichnis
SAN-Zertifikate
Anders als herkömmliche Zertifikate ist ein SAN-Zertifikat nicht nur für eine Domain gültig, sondern für mehrere alternative Domains oder IP-Adressen. Daher auch der Name SAN (Subject Alternative Name).

Wer mehr über die Hintergründe von SAN-Zertifikaten lesen möchte, sollte sich einmal den Abschnitt Hintergründe von SAN-Zertifikaten von meinem Kollegen Oguz Cankurt durchlesen.
Arbeitsordner erstellen
Alle relevanten Dateien für das SAN-Zertifikat möchte ich an einem zentralen Ort im Webserververzeichnis ablegen. Dafür erstelle ich einen Arbeitsordner, in dem ich alle SSL-relevanten Dateien ablege:
sudo mkdir /etc/apache2/ssl
cd /etc/apache2/ssl/
Erstellung der req.conf
Zunächst ist eine Konfigurationsdatei zu erstellen, in der die gewünschten DNS- und IP-Einträge zu hinterlegen sind. Die eigentliche Konfigurationsdatei ist mit folgendem Befehl erstellt:
sudo touch ubusrvreq.conf
sudo nano ubusrvreq.conf
In der Konfigurationsdatei ist folgender Inhalt anzugeben:
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = DE
ST = NRW
L = ESSEN
O = NOCKSOFT
OU = IT
CN = ubusrv.lab.local
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.52.154
DNS.1 = ubusrv
DNS.2 = ubusrv.lab.local
DNS.3 = ubusrvalias
DNS.4 = ubusrvalias.lab.local
Die Werte unter "[req_distinguished_name]" und "[alt_names]" sind entsprechend anzupassen. Unter "[alt_names]" können auch beliebige Einträge hinzugefügt oder entfernt werden. Wichtig ist nur die Nummerierung der Parameter.

Private Key erstellen
Der Private Key ist wie folgt erstellt:
sudo openssl genrsa -out ubusrv.key 2048
Im oberen Beispiel wird der Private Key mit einem 2048 Bit Schlüssel erstellt. Das ist Stand 2021 ausreichend sicher. Wer mehr Sicherheit möchte, kann auf Lasten der Rechenkapazität auch einen stärkeren Schlüssel wie 4096 Bit angeben.
CSR erstellen
Mit dem Private Key und der Konfigurationsdatei kann jetzt ein CSR erstellt werden, der später für das Zertifikat benötigt wird. Das geht wie folgt:
sudo openssl req -new -out ubusrv.csr -key ubusrv.key -config ubusrvreq.conf
Zertifikat erstellen
Es gibt jetzt mehrere Möglichkeiten das Zertifikat zu erstellen. Ich stelle zwei Möglichkeiten genauer vor: Active Directory Zertifikatsdienste und Self Signed Zertifikat. Der Weg über die Active Directory Zertifikatsdienste oder einer anderen Lösung zur Erzeugung von gültigen Zertifikaten, ist wenn möglich, dem Self Signed Zertifikat immer vorzuziehen.
Zertifikat über die Active Directory Zertifikatsdienste erstellen
Der Inhalt des CSR kann einfach kopiert und in den Active Directory Zertifikatsdiensten eingefügt werden. In den Active Directory Zertifikatsdiensten ist eine erweiterte Zertifikatsanforderung zu erstellen:

Das Zertifikat (*.cer) kann nun in Base-64-codiert heruntergeladen werden:

Anschließend ist das Zertifikat wieder auf dem Server unter /etc/apache2/ssl/ abzulegen. Dazu gibt es zwei Wege: Entweder man überträgt die Zertifikatsdatei per WinSCP auf den Ubuntu-Server oder man erstellt auf dem Ubuntu-Server eine neue Datei und fügt den Inhalt der heruntergeladenen Zertifikatsdatei dort ein:
cd /etc/apache2/ssl/
sudo touch ubusrv.cer
sudo nano ubusrv.cer
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Self Signed Zertifikat mit OpenSSL erstellen
Wer über keine Active Directory Zertifikatsdienste verfügt oder aus einem anderen Grund lieber ein selbst signiertes Zertifikat erstellen möchte, kann dies wie folgt tun:
sudo openssl x509 -req -days 365 -in ubusrv.csr -signkey ubusrv.key -sha256 -out ubusrv.cer
Zertifikat von einer offiziellen CA ausstellen lassen
Soll das Zertifikat im Internet verwendet werden, ist der CSR einem entsprechenden Dienstleister wie z.B. GlobalSign o.ä. einzureichen, der ein gültiges Zertifikat für den CSR ausstellt.
Zertifikat in Apache einbinden
In dieser Anleitung werden wir die Apache-Konfiguration im VirtualHost anpassen. Wenn noch keine vorhanden ist, muss zunächst eine erstellt werden:
cd /etc/apache2/sites-available/
sudo touch vhost.conf
sudo nano vhost.conf
Eine gültige Konfiguration kann sich von Anwendung zu Anwendung unterscheiden. Hier daher ein Beispiel für eine einfache Webseite mit HTTPS und automatischer Weiterleitung von HTTP auf HTTPS:
<VirtualHost *:80>
ServerName 192.168.52.154
ServerAlias ubusrv ubusrv.lab.local ubusrvalias ubusrvalias.lab.local
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}$1 [R,L]
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/ubusrv.cer
SSLCertificateKeyFile /etc/apache2/ssl/ubusrv.key
SSLProtocol -ALL +TLSv1.2 +TLSv1.3
ServerName 192.168.52.154
ServerAlias ubusrv ubusrv.lab.local ubusrvalias ubusrvalias.lab.local
DocumentRoot /var/www/html
</VirtualHost>

Außerdem muss der VirtualHost sowie das SSL- und Rewrite-Modul im Apache noch aktiviert werden:
sudo a2ensite vhost.conf
sudo a2enmod ssl
sudo a2enmod rewrite
sudo service apache2 restart
Jetzt ist die Seite per HTTPS aufrufbar:

HSTS aktivieren
Apache und HTTPS ist auf dem Ubuntu-Server jetzt erfolgreich konfiguriert. Wer jedoch optional die Sicherheit durch HSTS weiter erhöhen möchte, kann HSTS wie folgt in der VirtualHost-Konfiguration aktivieren:
<VirtualHost *:80>
ServerName 192.168.52.154
ServerAlias ubusrv ubusrv.lab.local ubusrvalias ubusrvalias.lab.local
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}$1 [R,L]
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/ubusrv.cer
SSLCertificateKeyFile /etc/apache2/ssl/ubusrv.key
SSLProtocol -ALL +TLSv1.2 +TLSv1.3
Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
ServerName 192.168.52.154
ServerAlias ubusrv ubusrv.lab.local ubusrvalias ubusrvalias.lab.local
DocumentRoot /var/www/html
</VirtualHost>
Der Parameter max-age wird in Sekunden angegeben und sagt aus, für die lange zu dem Server nur noch eine gesicherte Verbindung über HTTPS aufgebaut werden darf.
Anschließend muss das Headers-Modul noch im Apache aktiviert werden:
sudo a2enmod headers
sudo service apache2 restart
Quellen
https://www.thomas-krenn.com/de/wiki/Openssl_Multi-Domain_CSR_erstellen
https://www.bjoerns-techblog.de/2017/07/hsts-im-apache-aktivieren/
2 Antworten auf „HTTPS mit SAN-Zertifikat für Apache unter Ubuntu konfigurieren“
Hallo, danke erstmal für diese tolle Anleitung! Ich habe diese Anleitung für eine lokale Instanz umgesetzt (allerdings unter Windows 10 in Verbindung mit XAMPP). Unter Chromium Browsern wird das Zertifikat auch als Sicher angezeigt. Unter Firefox allerdings bekomme ich folgende Fehlermeldung:
Fehlercode: SEC_ERROR_UNKNOWN_ISSUER
Der Zertifikat-Aussteller der Gegenstelle wurde nicht erkannt.
HTTP Strict Transport Security: false
HTTP Public Key Pinning: false
Hättest du eventuell eine Idee was ich falsch gemacht haben könnte?
Gruß
Adrian
Hallo Adrian,
Firefox hat seinen eigenen Zertifikatsspeicher und greift nicht auf den von Windows zu. Eventuell müsstest du das Zertifikat also erst im Firefox installieren oder als Ausnahme definieren. Die Fehlermeldung "SEC_ERROR_UNKNOWN_ISSUER" deutet darauf hin, dass das Zertifikat selbstsigniert ist und dem Browser erst als "sicher" erklärt werden muss.
LG Rafael