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 Ausführungs-Dialog öffnen mit win + R und den Befehl
certmgr.msc
ausführen.
Wähle im Dialog links das Verzeichnis Vertrauenswürdige Stammzertifizierungsstellen
(vgl. Abb. Punkt 2
).
Navigiere im Menu zu Aktion
-> Alle Aufgaben
-> importieren
.
Bestätige den Import-Vorgang mit weiter
.
Wähle über durchsuchen
dein Stammzertifikat aus. Anschließend über
weiter
fortfahren.
Bestätige den Ablageort mit weiter
.
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
Über Einstellungen
-> Datenschutz und Sicherheit
-> Zertifikate anzeigen
die vorhandenen Zertifikate anzeigen lassen.
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.