SSL-Zertifikate für localhost erstellen

Hier in diesem Beitrag zeige ich dir, wie du ein valides SSL Zertifikat für einen lokalen Webserver erstellen kannst. Für diesen Zweck errichten wir eine eigene Zertifizierungsstelle auf einem lokalen Linux Homeserver.

SSL-Zertifikat der Zertifizierungsstelle erstellen

Als erstes erstellen wir den Schlüssel des Root Zertifikates. Dazu verbinden wir uns mit dem Server und führen folgenden Befehl aus:

sudo openssl genrsa -out /etc/ssl/private/rootCA.key 4096

Anschließend nutzen wir den neuen Schlüssel, um ein Zertifikat zu erstellen:

sudo openssl req -x509 -new -nodes -key /etc/ssl/private/rootCA.key -sha512 -days 5475 -out /etc/ssl/certs/rootCA.pem

Damit wäre vorerst die Root-Zertifizierungsstelle erstellt. Sichere dir die Datei /etc/ssl/certs/rootCA.pem auf deinem lokalen Computer.

SSL Konfigurations-Datei erstellen

Anschließend geht es weiter mit der Erstellung einer Konfigurations-Datei, um ein wenig Arbeitszeit zu sparen:

cd ~/opt
vi ssl.cnf

Ich nutze vim für die Bearbeitung, aber man kann natürlich jeden Editor seiner Wahl nutzen.

Die Konfigurations-Datei füllen wir mit folgendem Inhalt (bitte nicht vergessen, die Abschnitte dn und alt_names anzupassen):

[req]
# standard-verschlüsselung
default_bits = 4096
# verhindere prompt für die Zertifikat-Erstellung
# (Daten kommen aus dieser Datei)
prompt = no
# verschlüsselungs-methode
default_md = sha512
# prevent key encryption
encrypt_key = no
# Sektion für Zertifizierer-Informationen:
distinguished_name = dn

# Zertifizierer-Informationen:
[dn]
# Länder-Code
C=DE
# Bundesland
ST=Schleswig-Holstein
# Stadt
L=Kiel
# Bezeichnung/Firmen-Name/Dein Name:
O=Local media CA
# Aussteller Name
OU=qm-b
# E-Mail Addresse
emailAddress=qm-b@example.com
# primärer server-name
CN = media.local

[v3_ca]
subjectAltName=@alt_names

[alt_names]
# primärer server-name
DNS.1=media.local
# wildcard subdomains
DNS.2 = *.media.local

Anschließend speichern wir die Datei ab und erstellen mit Hilfe dieser Datei die Server-Zertifikate.

Erstellen des SSL-Zertifikats

Vorab beginnen wir wieder, die Basics zu erstellen:

sudo openssl req -new -keyout /etc/ssl/private/media.local.key -out /etc/ssl/private/media.local.csr -config /opt/ssl.cnf

Anschließend können wir das finale Zertifikat erstellen, zertifiziert/signiert durch unser zu Beginn erstelltes Zertifikat der Zertifizierungs-Stelle:

sudo openssl x509 -req \
-in /etc/ssl/private/media.local.csr \
-CA /etc/ssl/certs/rootCA.pem \
-CAkey /etc/ssl/private/rootCA.key \
-CAcreateserial \
-out /etc/ssl/certs/media.local.crt \
-days 3650 \
-extfile /opt/ssl.cnf \
-extensions v3_ca

Einbinden des Zertifikates

Im folgenden 2 Kurz-Beispiele über eine SSL Konfiguration für apache2 und nginx.

Einbinden des Zertifikates in Apache

<VirtualHost *:80>
    ServerName media.local
    ServerAlias www.media.local
</VirtualHost>
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/vhosts/media.local/httpdocs
        ServerName media.local
        ServerAlias www.media.local

        ErrorLog ${APACHE_LOG_DIR}/error.media.local.log
        CustomLog ${APACHE_LOG_DIR}/access.media.local.log combined

        SSLEngine on
        SSLCertificateFile      /etc/ssl/certs/media.local.crt
        SSLCertificateKeyFile   /etc/ssl/private/media.local.key
        <IfModule mod_headers.c>
            Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
        </IfModule>
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
        </Directory>
    </VirtualHost>
</IfModule>
# configuration
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLHonorCipherOrder     off
SSLSessionTickets       off

Schnell noch die Konfiguration prüfen…

sudo apache2ctl -t

… und anschließend Apache neu starten.

sudo systemctl restart apache2

Einbinden des Zertifikates in nginx

server {
    listen 443;
    ssl on;
    ssl_certificate /etc/ssl/certs/media.local.crt;
    ssl_certificate_key /etc/ssl/private/media.local.key;
    root /var/www/vhosts/media.local/httpdocs;
    server_name media.local;

    access_log /var/log/nginx/nginx.vhost.access.log;
    error_log /var/log/nginx/nginx.vhost.error.log;

    location / {
        root /var/www/;
        root  /var/www/vhosts/media.local/httpdocs/;
        index index.html;
    }
}

Anschließend nginx neu starten:

sudo systemctl restart nginx

Zertifizierungsstelle auf PC/Laptop/Smartphone

Windows

Windows Stammzertifizierungsstelle hinzufügen - Schritt 1
Programm ausführen

Windows Ausführungs-Dialog öffnen mit win + R und den Befehl

certmgr.msc

ausführen.

Windows Stammzertifizierungsstelle hinzufügen - Schritt 2
Eigene Stammzertifizierungsstellen

Wähle im Dialog links das Verzeichnis Vertrauenswürdige Stammzertifizierungsstellen (vgl. Abb. Punkt 2).

Windows Stammzertifizierungsstelle hinzufügen - Schritt 3
Import auswählen

Navigiere im Menu zu Aktion -> Alle Aufgaben -> importieren.

Windows Stammzertifizierungsstelle hinzufügen - Schritt 4
Import Dialog

Bestätige den Import-Vorgang mit weiter.

Windows Stammzertifizierungsstelle hinzufügen - Schritt 5
rootCA suchen

Wähle über durchsuchen dein Stammzertifikat aus. Anschließend über weiter fortfahren.

Windows Stammzertifizierungsstelle hinzufügen - Schritt 6
SSL Zertifikat wählen

Bestätige den Ablageort mit weiter.

Windows Stammzertifizierungsstelle hinzufügen - Schritt 7
Fertigstellen des SSL Imports

Nach Überprüfung mit Fertig stellen bestätigen.

Einige Anwendungen/Browser müssen neu gestartet werden bzw ein reboot des Systems ist erforderlich. Nach Abschluss ist deine Zertifizierungsstelle in zumindest einigen Browsern und Apps als sicher anerkannt.

Browser

Browser, die diese Methode nicht unterstützen, lassen das SSL Zertifikat in den Einstellungen importieren.

Firefox

Firefox - Eigene Stammzertifizierungsstellen hinzufügen - Schritt 1
Firefox - Eigene Stammzertifizierungsstellen

Über Einstellungen -> Datenschutz und Sicherheit -> Zertifikate anzeigen die vorhandenen Zertifikate anzeigen lassen.

Firefox - Eigene Stammzertifizierungsstellen hinzufügen - Schritt 1
Firefox - Eigene Stammzertifizierungsstellen

Wähle zuerst den Tab Zertifizierungsstellen unter Punkt 2 und wähle anschließend unter Punkt 3 importieren aus. Wähle dein Zertifikat aus und bestätige mit Ok.

Chrome

Unter Windows verwendet Chrome die Zertifizierungsstellen von Windows. In Linux Distributionen kann man die Zertifikate ziemlich simultan zu Firefox importieren.