So erstellen Sie ein SSL-Zertifikat unter Apache für CentOS 7

Einführung

TLS oder "Transport Layer Security" und sein VorgängerSSL, was für "Secure Sockets Layer" steht, sind Webprotokolle, mit denen normaler Datenverkehr in einen geschützten, verschlüsselten Wrapper eingeschlossen wird. Mithilfe dieser Technologie können Server Datenverkehr sicher zwischen Server und Client senden, ohne dass die Nachrichten von einer externen Partei abgefangen und gelesen werden müssen. Das Zertifikatsystem unterstützt Benutzer auch bei der Überprüfung der Identität der Sites, mit denen sie eine Verbindung herstellen.

In diesem Handbuch zeigen wir Ihnen, wie Sie ein selbstsigniertes SSL-Zertifikat für die Verwendung mit einem Apache-Webserver auf einem CentOS 7-Computer einrichten.

[.Hinweis]##

Note: Ein selbstsigniertes Zertifikat verschlüsselt die Kommunikation zwischen Ihrem Server und allen Clients. Da es jedoch nicht von einer der vertrauenswürdigen Zertifizierungsstellen signiert ist, die in den Webbrowsern enthalten sind, können Benutzer das Zertifikat nicht verwenden, um die Identität Ihres Servers automatisch zu überprüfen.

Ein selbstsigniertes Zertifikat ist möglicherweise geeignet, wenn Sie keinen Domänennamen mit Ihrem Server verknüpft haben und wenn die verschlüsselte Webschnittstelle nicht für Benutzer sichtbar ist. Wenn Sie einen Domainnamen haben, ist es in vielen Fällen besser, ein CA-signiertes Zertifikat zu verwenden. Sie erfahren, wie Sie mit dem Let's Encrypt-Projekthere.
ein kostenloses vertrauenswürdiges Zertifikat einrichten

Voraussetzungen

Bevor Sie mit diesem Handbuch beginnen, müssen zunächst einige Schritte ausgeführt werden.

Sie benötigen Zugriff auf einen CentOS 7-Server mit einem Nicht-Root-Benutzer, der über die Berechtigungen vonsudoverfügt. Wenn Sie dies noch nicht konfiguriert haben, können SieCentOS 7 initial server setup guide durchlaufen, um dieses Konto zu erstellen.

Sie müssen auch Apache installiert haben, um virtuelle Hosts dafür zu konfigurieren. Wenn Sie dies noch nicht getan haben, können Sieyum verwenden, um Apache über die Standard-Software-Repositorys von CentOS zu installieren:

sudo yum install httpd

Aktivieren Sie als Nächstes Apache als CentOS-Dienst, damit es nach einem Neustart automatisch gestartet wird:

sudo systemctl enable httpd.service

Nachdem Sie diese Schritte ausgeführt haben, können Sie sich über SSH als Benutzer ohne Rootberechtigung anmelden und mit dem Lernprogramm fortfahren.

Schritt eins: Installiere Mod_ssl

Um das selbstsignierte Zertifikat einzurichten, müssen wir zunächst sicherstellen, dassmod_ssl, ein Apache-Modul, das die SSL-Verschlüsselung unterstützt, auf dem Server installiert ist. Wir könnenmod_ssl mit dem Befehlyum installieren:

sudo yum install mod_ssl

Das Modul wird während der Installation automatisch aktiviert und Apache kann nach dem Neustart ein SSL-Zertifikat verwenden. Sie müssen keine zusätzlichen Schritte ausführen, damitmod_ssl einsatzbereit ist.

Schritt zwei: Erstellen Sie ein neues Zertifikat

Nachdem Apache nun zur Verwendung der Verschlüsselung bereit ist, können wir ein neues SSL-Zertifikat generieren. Das Zertifikat enthält einige grundlegende Informationen zu Ihrer Site sowie eine Schlüsseldatei, mit der der Server verschlüsselte Daten sicher verarbeiten kann.

Zuerst müssen wir ein neues Verzeichnis erstellen, um unseren privaten Schlüssel zu speichern (das Verzeichnis/etc/ssl/certsist bereits verfügbar, um unsere Zertifikatdatei zu speichern):

sudo mkdir /etc/ssl/private

Da Dateien in diesem Verzeichnis streng vertraulich behandelt werden müssen, ändern wir die Berechtigungen, um sicherzustellen, dass nur der Root-Benutzer Zugriff hat:

sudo chmod 700 /etc/ssl/private

Nachdem wir einen Speicherort für unsere Dateien haben, können wir die SSL-Schlüssel- und Zertifikatdateien mitopenssl erstellen:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Nachdem Sie die Anfrage eingegeben haben, werden Sie zu einer Eingabeaufforderung weitergeleitet, in der Sie Informationen zu Ihrer Website eingeben können. Bevor wir darauf eingehen, werfen wir einen Blick darauf, was in dem Befehl passiert, den wir ausgeben:

  • openssl: Dies ist das grundlegende Befehlszeilentool zum Erstellen und Verwalten von OpenSSL-Zertifikaten, Schlüsseln und anderen Dateien.

  • req -x509: Dies gibt an, dass die CSR-Verwaltung (X.509 Certificate Signing Request) verwendet werden soll. Der „X.509“ ist ein Infrastrukturstandard für öffentliche Schlüssel, den SSL und TLS für die Verwaltung von Schlüsseln und Zertifikaten einhalten.

  • -nodes: Dies weist OpenSSL an, die Option zum Sichern unseres Zertifikats mit einer Passphrase zu überspringen. Wir brauchen Apache, um die Datei ohne Benutzereingriff lesen zu können, wenn der Server startet. Eine Passphrase würde dies verhindern, da wir sie nach jedem Neustart eingeben müssten.

  • -days 365: Diese Option legt fest, wie lange das Zertifikat als gültig angesehen wird. Wir setzen es für ein Jahr hier.

  • -newkey rsa:2048: Dies gibt an, dass gleichzeitig ein neues Zertifikat und ein neuer Schlüssel generiert werden sollen. Wir haben in einem vorherigen Schritt nicht den Schlüssel erstellt, der zum Signieren des Zertifikats erforderlich ist, und müssen ihn daher zusammen mit dem Zertifikat erstellen. Der Teilrsa:2048 weist ihn an, einen RSA-Schlüssel mit einer Länge von 2048 Bit zu erstellen.

  • -keyout: Diese Zeile teilt OpenSSL mit, wo die generierte private Schlüsseldatei, die wir erstellen, abgelegt werden soll.

  • -out: Hiermit wird OpenSSL mitgeteilt, wo das von uns erstellte Zertifikat abgelegt werden soll.

Füllen Sie die Eingabeaufforderungen entsprechend aus. Die wichtigste Zeile ist die, dieCommon Name anfordert. Sie müssen den Domainnamen eingeben, der Ihrem Server zugeordnet werden soll. Sie können stattdessen die öffentliche IP-Adresse eingeben, wenn Sie keinen Domainnamen haben.

Die vollständige Liste der Eingabeaufforderungen sieht ungefähr so ​​aus:

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:example.com
Email Address []:[email protected]

Beide von Ihnen erstellten Dateien werden in den entsprechenden Unterverzeichnissen des Verzeichnisses/etc/sslabgelegt.

Während wir OpenSSL verwenden, sollten wir auch eine starke Diffie-Hellman-Gruppe erstellen, die bei der Aushandlung vonPerfect Forward Secrecy mit Clients verwendet wird.

Wir können dies tun, indem wir Folgendes eingeben:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Dies kann einige Minuten dauern, aber wenn dies erledigt ist, haben Sie eine starke DH-Gruppe bei/etc/ssl/certs/dhparam.pem, die wir in unserer Konfiguration verwenden können.

Da die mit CentOS 7 gelieferte Version von Apache nicht die DirektiveSSLOpenSSLConfCmdenthält, müssen wir die generierte Datei manuell an das Ende unseres selbstsignierten Zertifikats anhängen. Geben Sie dazu Folgendes ein:

cat /etc/ssl/certs/dhparam.pem | sudo tee -a /etc/ssl/certs/apache-selfsigned.crt

Dieapache-selfsigned.crt-Datei sollte jetzt sowohl das Zertifikat als auch die generierte Diffie-Hellman-Gruppe enthalten.

Schritt drei: Richten Sie das Zertifikat ein

Wir haben jetzt alle erforderlichen Komponenten der fertigen Schnittstelle. Als Nächstes müssen Sie die virtuellen Hosts so einrichten, dass das neue Zertifikat angezeigt wird.

Öffnen Sie die SSL-Konfigurationsdatei von Apache in Ihrem Texteditor mit Root-Rechten:

sudo vi /etc/httpd/conf.d/ssl.conf

Suchen Sie den Abschnitt, der mit<VirtualHost _default_:443> beginnt. Wir müssen hier einige Änderungen vornehmen, um sicherzustellen, dass unser SSL-Zertifikat korrekt auf unsere Site angewendet wird.

Anpassen der VirtualHost-Anweisungen

Kommentieren Sie zunächst die ZeileDocumentRootaus und bearbeiten Sie die Adresse in Anführungszeichen an der Position des Dokumentstamms Ihrer Site. Standardmäßig wird dies in/var/www/html angegeben, und Sie müssen diese Zeile nicht ändern, wenn Sie den Dokumentstamm für Ihre Site nicht geändert haben. Wenn Sie jedoch einem Leitfaden wie unseremApache virtual hosts setup guide gefolgt sind, kann der Dokumentenstamm Ihrer Site anders sein.

Kommentieren Sie als Nächstes die ZeileServerNameaus und ersetzen Siewww.example.com durch Ihren Domänennamen oder Ihre Server-IP-Adresse (je nachdem, welchen Namen Sie in Ihrem Zertifikat als allgemeinen Namen angegeben haben):

/etc/httpd/conf.d/ssl.conf


. . .
DocumentRoot "/var/www/example.com/public_html"
ServerName www.example.com:443

Suchen Sie als Nächstes die ZeilenSSLProtocol undSSLCipherSuite und löschen Sie sie entweder oder kommentieren Sie sie aus. Die Konfiguration, die wir in Kürze einfügen, bietet sicherere Einstellungen als die in CentOS Apache enthaltene Standardeinstellung:

/etc/httpd/conf.d/ssl.conf

. . .
# SSLProtocol all -SSLv2
. . .
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA

Suchen Sie die ZeilenSSLCertificateFile undSSLCertificateKeyFile und ändern Sie sie in das Verzeichnis, das wir unter/etc/httpd/ssl erstellt haben:

/etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

Wir sind jetzt mit den Änderungen innerhalb des tatsächlichenVirtualHost-Blocks fertig. Die nächsten Änderungen werden nach dem Ende des Tags</VirtualHost>in derselben Datei vorgenommen.

Einrichten sicherer SSL-Parameter

Um Apache SSL sicherer einzurichten, verwenden wir als Nächstes die Empfehlungen vonRemy van Elst auf der Site vonCipherli.st. Diese Website wurde entwickelt, um benutzerfreundliche Verschlüsselungseinstellungen für gängige Software bereitzustellen. Sie können mehr über seine Entscheidungen bezüglich der Apache-Auswahlhere lesen.

[.Hinweis]##

Note: Die vorgeschlagenen Einstellungen auf der oben verlinkten Site bieten hohe Sicherheit. Dies geht manchmal zu Lasten einer größeren Client-Kompatibilität. Wenn Sie ältere Clients unterstützen müssen, gibt es eine alternative Liste, auf die Sie zugreifen können, indem Sie auf den Link auf der Seite mit der Bezeichnung "Ja, geben Sie mir eine Verschlüsselungssuite, die mit älterer / alter Software funktioniert" klicken. Diese Liste kann anstelle der kopierten Elemente verwendet werden unten.

Die Wahl der von Ihnen verwendeten Konfiguration hängt weitgehend davon ab, was Sie unterstützen müssen. Beide bieten eine hohe Sicherheit.

Für unsere Zwecke können wir die bereitgestellten Einstellungen vollständig kopieren. Wir werden nur zwei kleine Änderungen vornehmen.

Nehmen Sie sich einen Moment Zeit, um sich überHTTP Strict Transport Security, or HSTS und speziell über“preload” functionality zu informieren. Das Vorladen von HSTS bietet erhöhte Sicherheit, kann jedoch weitreichende Konsequenzen haben, wenn es versehentlich oder falsch aktiviert wird. In diesem Handbuch werden die Einstellungen nicht vorab geladen, aber Sie können dies ändern, wenn Sie sicher sind, dass Sie die Auswirkungen verstehen.

Die andere Änderung, die wir vornehmen werden, besteht darin, dieSSLSessionTickets-Richtlinie zu kommentieren, da diese in der mit CentOS 7 gelieferten Apache-Version nicht verfügbar ist.

Fügen Sie die Einstellungen von der SiteAFTERam Ende des BlocksVirtualHostein:

/etc/httpd/conf.d/ssl.conf

    . . .

. . .

# Begin copied text
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
# SSLSessionTickets Off

Wenn Sie diese Änderungen vorgenommen haben, können Sie die Datei speichern und schließen.

Derzeit wird der Server sowohl unverschlüsselten HTTP- als auch verschlüsselten HTTPS-Datenverkehr bereitstellen. In den meisten Fällen wird aus Sicherheitsgründen empfohlen, HTTP automatisch an HTTPS umzuleiten. Wenn Sie diese Funktionalität nicht möchten oder benötigen, können Sie diesen Abschnitt ohne Bedenken überspringen.

Um den gesamten zu SSL-verschlüsselten Datenverkehr umzuleiten, erstellen und öffnen Sie eine Datei mit der Endung.conf im Verzeichnis/etc/httpd/conf.d:

sudo vi /etc/httpd/conf.d/non-ssl.conf

Erstellen Sie im Inneren einenVirtualHost-Block, der den Anforderungen an Port 80 entspricht. Verwenden Sie im Inneren die AnweisungServerName, um Ihren Domainnamen oder Ihre IP-Adresse erneut abzugleichen. Verwenden Sie dannRedirect, um alle Anforderungen abzugleichen und an SSLVirtualHost zu senden. Stellen Sie sicher, dass Sie den abschließenden Schrägstrich einfügen:

/etc/apache2/sites-available/000-default.conf


        ServerName www.example.com
        Redirect "/" "https://www.example.com/"

Speichern und schließen Sie diese Datei, wenn Sie fertig sind.

Vierter Schritt: Aktivieren Sie das Zertifikat

Inzwischen haben Sie ein SSL-Zertifikat erstellt und Ihren Webserver so konfiguriert, dass er auf Ihre Site angewendet wird. Um all diese Änderungen zu übernehmen und Ihre SSL-Verschlüsselung zu verwenden, können Sie den Apache-Server neu starten, um seine Konfigurationen und Module neu zu laden.

Überprüfen Sie zunächst Ihre Konfigurationsdatei auf Syntaxfehler, indem Sie Folgendes eingeben:

sudo apachectl configtest

Solange die Ausgabe mitSyntax OK endet, können Sie sicher fortfahren. Wenn dies nicht Teil Ihrer Ausgabe ist, überprüfen Sie die Syntax Ihrer Dateien und versuchen Sie es erneut:

Output. . .
Syntax OK

Starten Sie den Apache-Server neu, um Ihre Änderungen zu übernehmen, indem Sie Folgendes eingeben:

sudo systemctl restart httpd.service

Stellen Sie als Nächstes sicher, dass die Ports 80 und 443 in Ihrer Firewall geöffnet sind. Wenn Sie keine Firewall verwenden, können Sie fortfahren.

Wenn einefirewalld-Firewall ausgeführt wird, können Sie diese Ports öffnen, indem Sie Folgendes eingeben:

sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --runtime-to-permanent

Wenn eineiptables-Firewall ausgeführt wird, hängen die Befehle, die Sie ausführen müssen, stark von Ihrem aktuellen Regelsatz ab. Für einen grundlegenden Regelsatz können Sie HTTP- und HTTPS-Zugriff hinzufügen, indem Sie Folgendes eingeben:

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Versuchen Sie in Ihrem Webbrowser, Ihren Domainnamen oder Ihre IP mithttps:// zu besuchen, um Ihr neues Zertifikat in Aktion zu sehen.

https://example.com/

Ihr Webbrowser wird Sie wahrscheinlich warnen, dass das Sicherheitszertifikat der Site nicht vertrauenswürdig ist. Da Ihr Zertifikat nicht von einer Zertifizierungsstelle signiert ist, der der Browser vertraut, kann der Browser die Identität des Servers, zu dem Sie eine Verbindung herstellen möchten, nicht überprüfen. Wir haben ein selbstsigniertes Zertifikat anstelle eines von einer vertrauenswürdigen Zertifizierungsstelle signierten Zertifikats erstellt. Dies ist also absolut sinnvoll.

Sobald Sie der Identitätsüberprüfung des Browsers eine Ausnahme hinzugefügt haben, können Sie zu Ihrer neu gesicherten Site wechseln.

Fazit

Sie haben Ihren Apache-Server so konfiguriert, dass er sowohl HTTP- als auch HTTPS-Anforderungen verarbeitet. Auf diese Weise können Sie sicher mit Kunden kommunizieren und verhindern, dass Dritte Ihren Datenverkehr lesen können.

Wenn Sie vorhaben, SSL für eine öffentliche Website zu verwenden, sollten Sie wahrscheinlich ein SSL-Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle erwerben, um zu verhindern, dass die beängstigenden Warnungen jedem Ihrer Besucher angezeigt werden.