Beim Einsatz des Protokolls `https` auf Kunden-Websites stieß ich oft auf verschiedene Schwierigkeiten, die auf ein mangelndes Verständnis der Probleme und eine zu große Komplexität der Konzepte zurückzuführen waren.
In diesem Tutorial beschreibe ich detailliert die Schritte, um ein gültiges Zertifikat auf einem Webserver zu erhalten und einzusetzen.
In jeder Zwischenüberschrift fasse ich immer kurz den Schritt für Fortgeschrittene zusammen, und am Ende gehe ich auf die Details für Anfänger ein.
Warnung: Der gesamte Prozess der Bereitstellung eines Zertifikats kann über eine Stunde dauern und ist oft unterbrochen (die Website kann nicht verfügbar sein).
Die Anweisungen gehen davon aus, dass wir Zugang zu einem Terminal-Webserver haben, der unter Linux läuft und Apache verwendet.
Für Nginx gilt die gesamte Theorie gleichermaßen, nur die Verknüpfung der Zertifikatsdatei ist anders.
Wir verbinden uns über SSH mit dem Server.
Auf Mac oder Linux rufen Sie den Befehl auf:
ssh uživatel@server
Ich möchte zum Beispiel eine Verbindung mit dem Benutzer root
auf der Website baraja.cz
herstellen:
ssh root@baraja.cz
Oder an den Benutzer jan
zu einer bestimmten IP-Adresse:
ssh jan@127.0.0.1
Nach dem Absenden Ihrer Anfrage wird die Verbindung entweder direkt hergestellt oder Sie werden nach einem Passwort gefragt. Bei der Eingabe des Passworts wird nichts angezeigt. Bestätigen Sie das Passwort mit der Eingabetaste und warten Sie, bis die Verbindung autorisiert wird.
Warnung: Wenn wir keine Rechte für eine Aktion haben, müssen wir sie zuweisen. Wechseln Sie entweder direkt zum Benutzer
root
mit dem Befehlsudo su
, oder stellen Sie dem Befehl, den Sie als root ausführen wollen, das Wortroot
voran, z.B.root rm <name>
unter root wird die Datei<name>
löschen. Bei der Verwendung dessudo
-Befehls kann es vorkommen, dass wir regelmäßig nach einem Passwort gefragt werden.
Details:
Der SSH-Zugang wird von dem jeweiligen Hosting-Unternehmen eingerichtet, bei dem Sie einen Server gemietet haben.
Wenn Sie eine bestehende Website von http
auf https
umstellen, müssen Sie sicherstellen, dass der gesamte Verkehr auf das neue https
-Protokoll umgeleitet wird.
Im Falle von Apache kann dies leicht durch eine Umleitung in der Datei .htaccess
erreicht werden:
<IfModule mod_rewrite.c>RewriteEngine OnRewriteCond %{HTTPS} !onRewriteRule .? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]</IfModule>
Diese Konfiguration stellt sicher, dass alle Anfragen an http
mit HTTP-Code 301
auf https
umgeleitet werden. Diese Konfiguration ist die Standardeinstellung für das Nette-Framework, gilt aber auch für alle anderen Fälle.
Details:
Die Datei .htaccess
enthält die spezifische Webserver-Konfiguration, die sich auf jede Anfrage auswirkt. Sie befindet sich in der Regel im gleichen Verzeichnis wie die Datei "index.php" oder andere Dateien, die über das Internet zugänglich sind.
Die Einstellung ist nur für den Apache-Server gültig und kann bei einigen Hosts deaktiviert oder eingeschränkt sein. Ausführlichere Informationen erhalten Sie immer bei dem Unternehmen, bei dem Sie Ihre Website hosten.
Manchmal kommt es vor, dass .htaccess
nicht gut zusammenarbeiten will und die Konfiguration extrem schwierig ist (zum Beispiel für viele Domains, die sich alle unterschiedlich verhalten). In einem solchen Fall kann die Umleitung zu HTTPS notfalls direkt in PHP erfolgen:
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'aus') {$location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];header('HTTP/1.1 301 Dauerhaft verschoben');header('Standort:' . preg_replace('/^(https:\/\/(?:www\.)(.*)$/', '$1$2', $location));die;}
Fügen Sie das Skript in index.php
ein. Ich empfehle diese Lösung jedoch nicht.
Im Falle von Apache müssen wir die Datei Virtual hosts finden.
Sie befinden sich normalerweise unter dem Pfad /etc/apache2/sites-available
.
Listen Sie den Inhalt des Verzeichnisses mit dem Befehl ls -al
auf und finden Sie die Datei, in der die virtuelle Datei für unsere Website eingerichtet ist.
VirtualHosts befinden sich in der Regel in Dateien mit der Erweiterung .conf
. Die Voreinstellung ist oft in 000-default.conf
zu finden.
Details:
cd
geöffnet, zum Beispiel cd /etc/apache2/sites-available
.cat <name>
in das Terminal geschrieben oder mit den Befehlen nano <name>
oder vim <name>
bearbeitet.mc
Befehl) durchsucht werden, der im Falle von Ubuntu einfach mit apt-get install mc
oder sudo apt-get install mc
installiert wird.Innerhalb des virtuellen Hosts müssen wir einen neuen für den Port "443" vorbereiten (ein häufiges Problem kann die Blockierung des Ports 443 durch die Firewall sein).
Der Inhalt der Datei könnte zum Beispiel so aussehen:
<IfModule mod_ssl.c><VirtualHost *:443>ServerName baraja.czServerAdmin jan@barasek.comDocumentRoot /var/www/baraja.cz/wwwHeader always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"ErrorLog ${APACHE_LOG_DIR}/baraja.cz.ssl.error.logCustomLog ${APACHE_LOG_DIR}/baraja.cz.ssl.access.log combinedSSLEngine onSSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crtSSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.keySSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crtSSLProtocol all -SSLv3SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSSSSLHonorCipherOrder onSSLCompression off<FilesMatch "\.(cgi|shtml|phtml|php)$">SSLOptions +StdEnvVars</FilesMatch><Directory /usr/lib/cgi-bin>SSLOptions +StdEnvVars</Directory>BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0# MSIE 7 and newer should be able to use keepaliveBrowserMatch "MSIE [17-9]" \ssl-unclean-shutdown</VirtualHost></IfModule>
Die Datei ist der wichtigste Bereich:
SSLEngine onSSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crtSSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.keySSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crt
Das Verständnis für diese Konfiguration ist absolut entscheidend. Wenn Sie nach detaillierteren Informationen suchen müssen, verwenden Sie die Wörter SSLCertificateFile
, SSLCertificateKeyFile
und SSLCertificateChainFile
, die allen Apache-Servern gemeinsam sind.
Warnung: Das SSL-Problem ist relativ alt und es werden oft verschiedene Namen für dieselbe Sache verwendet, um die Abwärtskompatibilität zu wahren! Es ist daher wichtig, das Prinzip zu verstehen.
Details:
Es ist wichtig, dass VirualHost enthält:
<IfModule mod_ssl.c>
sagt, dass wir SSL verwenden wollenSSLCertificateFile
, SSLCertificateKeyFile
und SSLCertificateChainFile
sind Dateien mit bestimmten Schlüsseln.Mehr ist nicht nötig.
In der endgültigen Konfiguration von VirtualHost benötigen wir eigentlich nur 3 Dateien SSLCertificateFile
, SSLCertificateKeyFile
und SSLCertificateChainFile
, die wir irgendwo auf dem Server ablegen können (Name und Ort spielen keine Rolle). Es ist wichtig, dass ein Arbeitspfad angegeben wird und dass der Inhalt der Dateien gültig ist.
Die spezifische Methode zur Beschaffung der Zertifikate kann von CA zu CA unterschiedlich sein. Es kommt darauf an, den Grundsatz zu verstehen und ihn dann auf Ihren Fall anzuwenden.
Datei | Bedeutung |
---|---|
Dieses Zertifikat wird von der Behörde gesendet | "SSLCertificateFile" |
"SSLCertificateKeyFile" | Mein generierter privater Schlüssel |
SSLCertificateChainFile |
Ich habe aus dem Web heruntergeladen Typ intermediate + root |
Auf dem Server erzeugen wir zunächst den privaten Schlüssel. Das Wort privat ist wichtig, denn es bedeutet, dass niemand außer dem Webserver diese Daten kennt. Im Idealfall sollte sie den Server nie verlassen und an einem sicheren Ort aufbewahrt werden. Der Verlust dieses Schlüssels bedeutet einen Verlust an Sicherheit, da ein Angreifer in der Lage ist, sich als ein bestimmter Server auszugeben.
Um den Schlüssel zu erzeugen, verwenden Sie den Befehl:
openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr
Um es zu generieren, muss das Programm openssl
auf dem Server installiert sein, was wir zum Beispiel durch sudo apt install openssl
erreichen können.
Es kann mehrere Arten von Schlüsseln geben, in diesem Fall erzeugen wir einen RSA-Schlüssel mit einer Länge von 2048 Bytes (rsa:2048
).
Die Ausgabe des Befehls sind 2 Dateien (die Sie entsprechend Ihrer Domain benennen):
SSLCertificateKeyFile
.Der Inhalt des Antrags muss immer der zuständigen Behörde zur Genehmigung vorgelegt werden. Dies geschieht in der Regel über die Webschnittstelle in der Verwaltung auf der Website, auf der die Zertifikate verkauft werden. Die Genehmigung des Antrags hängt von der Art des Zertifikats ab. Sie wird in den meisten Fällen automatisch von einem Roboter durchgeführt und dauert zwischen 5 Minuten und 8 Stunden. Bei teuren Zertifikaten, bei denen auch die physischen Eigentumsverhältnisse des Standorts und der Betreibergesellschaft überprüft werden, erfolgt die Überprüfung manuell und kann mehrere Tage dauern.
Wenn Sie es eilig haben, gibt es eine Zertifizierungsstelle Let's encrypt
, die Anträge automatisch mit einer Gültigkeit von 3 Monaten genehmigt.
Warnung: In einigen Fällen bietet die CA eine automatische Anfrageerstellung an. Dies ist nicht empfehlenswert, da es den privaten Schlüssel kennt. In diesem Fall müssen Sie sich den privaten Schlüssel immer von der Agentur besorgen und ihn in einer Datei auf dem Server ablegen, so als ob Sie den Antrag erstellen würden.
In der Zwischenzeit, während wir darauf warten, dass der Antrag genehmigt und das Zertifikat ausgestellt wird, sichern wir den öffentlichen Schlüssel der CA. In Apache VirtualHost wird dies durch die Datei SSLCertificateChainFile
repräsentiert (auf Englisch heißt dies Intermediate and Root CA
). Dieser Schlüssel ist im Prinzip öffentlich und teilt dem Webbrowser mit, wer die CA ist. Diese Datei wird in der Regel von der Website der zuständigen Behörde heruntergeladen oder uns per E-Mail zugestellt.
Sie sollten immer den richtigen Schlüssel für den von Ihnen gewählten Algorithmus herunterladen. RapidSSL kann zum Beispiel hier heruntergeladen werden: https://knowledge.digicert.com/generalinformation/INFO1548…
Auf der Grundlage des Antrags hat uns die Zertifizierungsstelle ein Zertifikat ausgestellt. Im Fall von Apache VirtualHost wird sie durch die Datei "SSLCertificateFile" dargestellt.
Wichtig ist, dass das Zertifikat eine begrenzte Gültigkeit hat und wir diesen Vorgang wiederholen müssen (idealerweise vor Ablauf). Sie können das Ablaufdatum in Chrome leicht herausfinden, indem Sie auf das grüne Vorhängeschloss im Browser klicken und sich die Zertifikatsdetails ansehen, falls es von der Zertifizierungsstelle mitgeteilt wird.
Nach dem Ablaufdatum ist das Zertifikat ungültig, und die Website verweigert die Verbindung, und die Benutzer erhalten eine Fehlermeldung über die Sicherheitsverletzung.
Die Korrektheit der Apache-Einstellungen kann teilweise mit dem Befehl apache2ctl -S
überprüft werden.
Damit die Änderungen wirksam werden, muss der Apache neu gestartet werden, zum Beispiel mit dem Befehl:
sudo service apache2 restart
Wenn keine Fehlermeldung ausgegeben wird, überprüfen wir sofort die Funktionalität über einen Webbrowser (ich empfehle Google Chrome, der die meisten Details anzeigt).
Im Falle eines Fehlers rufen wir den Befehl apache2ctl -S
auf, der den Pfad zu den Logs anzeigen kann, wo wir ungefähr sehen können, was falsch ist. Es ist wichtig, dass Sie alle Schritte in dieser Anleitung in der richtigen Reihenfolge ausführen und keine der Tasten vertauschen.
Vergessen Sie nicht, das Ablaufdatum in Ihrem Kalender zu markieren, damit Sie Ihr Zertifikat rechtzeitig erneuern können. Einige Zertifizierungsstellen senden eine Benachrichtigung per E-Mail, doch ist dies nicht immer zuverlässig.
Sie können den Erneuerungsprozess durchführen und parallel dazu ein neues Zertifikat erhalten, während das aktuelle noch läuft, und es dann einfach gleichzeitig ersetzen.
Für die automatische Erneuerung empfehle ich [Certbot] (https://certbot.eff.org), das die Gültigkeit von Zertifikaten automatisch überwachen und erneuern kann. Die Erneuerung erfolgt z. B. durch einen Cron, der einmal im Monat nachts einen Befehl zur Ausstellung eines neuen Zertifikats aufruft und dieses sofort ausliefert.
Wenn Sie sich mit der Verwaltung von Zertifikaten nicht auskennen, ist es eine gute Idee, bei einem etablierten Unternehmen zu hosten, das Ihnen ein funktionales Hosting einschließlich eines Zertifikats zur Verfügung stellt. Das erspart Ihnen eine Menge Ärger.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | de