So erstellen Sie ein selbstsigniertes SSL-Zertifikat für Apache in Ubuntu 18.04

Eine frühere Version dieses Tutorials wurde vonJustin Ellingwood geschrieben

Einführung

TLS oder Transport Layer Security und sein VorgängerSSL, der 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 Servern und Clients senden, ohne dass Nachrichten von Dritten abgefangen werden können. 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 unter Ubuntu 18.04 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 eine verschlüsselte Webschnittstelle nicht für Benutzer sichtbar ist. Wenn Siedo 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 beginnen, sollte ein Benutzer ohne Rootberechtigung mit den Berechtigungen vonsudokonfiguriert sein. Sie können lernen, wie Sie ein solches Benutzerkonto einrichten, indem Sie unserenInitial Server Setup with Ubuntu 18.04 folgen.

Außerdem muss der Apache-Webserver installiert sein. Wenn Sie einen gesamten LAMP-Stack (Linux, Apache, MySQL, PHP) auf Ihrem Server installieren möchten, können Sie unserer Anleitung zusetting up LAMP on Ubuntu 18.04 folgen. Wenn Sie nur den Apache-Webserver benötigen, überspringen Sie die Schritte zu PHP und MySQL.

Wenn Sie die Voraussetzungen erfüllt haben, fahren Sie unten fort.

[[Schritt-1 -–- Erstellen des SSL-Zertifikats]] == Schritt 1 - Erstellen des SSL-Zertifikats

TLS/SSL works by using a combination of a public certificate and a private key. Der SSL-Schlüssel wird auf dem Server geheim gehalten. Es wird zum Verschlüsseln von an Clients gesendeten Inhalten verwendet. Das SSL-Zertifikat wird öffentlich für alle Benutzer freigegeben, die den Inhalt anfordern. Es kann verwendet werden, um den mit dem zugehörigen SSL-Schlüssel signierten Inhalt zu entschlüsseln.

Wir können mit OpenSSL in einem einzigen Befehl ein selbstsigniertes Paar aus Schlüssel und Zertifikat 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

Sie werden eine Reihe von Fragen gestellt. 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: Dieser Unterbefehl 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. Wir möchten ein neues X.509-Zertifikat erstellen und verwenden daher diesen Unterbefehl.

  • -x509: Dadurch wird der vorherige Unterbefehl weiter geändert, indem dem Dienstprogramm mitgeteilt wird, dass ein selbstsigniertes Zertifikat erstellt werden soll, anstatt wie normalerweise eine Zertifikatsignierungsanforderung zu generieren.

  • -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.

Wie oben erwähnt, werden mit diesen Optionen sowohl eine Schlüsseldatei als auch ein Zertifikat erstellt. Wir werden einige Fragen zu unserem Server stellen, um die Informationen korrekt in das Zertifikat einzubetten.

Füllen Sie die Eingabeaufforderungen entsprechend aus. The most important line is the one that requests the Common Name (e.g. server FQDN or YOUR name). You need to enter the domain name associated with your server or, more likely, your server’s public IP address.

Die gesamten Eingabeaufforderungen sehen ungefähr so ​​aus:

OutputCountry Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com

Beide von Ihnen erstellten Dateien werden in den entsprechenden Unterverzeichnissen unter/etc/ssl abgelegt.

[[Schritt-2 -–- Konfigurieren von Apache-to-Use-SSL]] == Schritt 2 - Konfigurieren von Apache für die Verwendung von SSL

Wir haben unsere Schlüssel- und Zertifikatdateien im Verzeichnis/etc/sslerstellt. Jetzt müssen wir nur noch unsere Apache-Konfiguration ändern, um diese auszunutzen.

Wir werden einige Anpassungen an unserer Konfiguration vornehmen:

  1. Wir werden ein Konfigurations-Snippet erstellen, um sichere SSL-Standardeinstellungen festzulegen.

  2. Wir werden die enthaltene SSL Apache Virtual Host-Datei so ändern, dass sie auf unsere generierten SSL-Zertifikate verweist.

  3. (Empfohlen) Die unverschlüsselte Virtual Host-Datei wird so geändert, dass Anforderungen automatisch an den verschlüsselten Virtual Host umgeleitet werden.

Wenn wir fertig sind, sollten wir eine sichere SSL-Konfiguration haben.

Erstellen eines Apache-Konfigurations-Snippets mit starken Verschlüsselungseinstellungen

Zunächst erstellen wir ein Apache-Konfigurations-Snippet, um einige SSL-Einstellungen zu definieren. Dies wird Apache mit einer starken SSL-Verschlüsselungssuite einrichten und einige erweiterte Funktionen aktivieren, die dazu beitragen, unseren Server sicher zu halten. Die von uns festgelegten Parameter können von allen virtuellen Hosts verwendet werden, die SSL aktivieren.

Erstellen Sie ein neues Snippet im Verzeichnis/etc/apache2/conf-available. Wir werden die Dateissl-params.conf benennen, um ihren Zweck klar zu machen:

sudo nano /etc/apache2/conf-available/ssl-params.conf

Um Apache SSL sicher einzurichten, verwenden wir die Empfehlungen von Remy van Elst auf derCipherli.st-Seite. Diese Website wurde entwickelt, um benutzerfreundliche Verschlüsselungseinstellungen für gängige Software bereitzustellen.

[.Hinweis]##

Die vorgeschlagenen Einstellungen auf der oben verlinkten Website bieten starke 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 eine kleine Änderung vornehmen. Wir werden denStrict-Transport-Security Header (HSTS) deaktivieren.

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 aktiviert. Sie können dies jedoch ändern, wenn Sie sicher sind, dass Sie die Auswirkungen verstehen.

Bevor Sie sich entscheiden, nehmen Sie sich einen Moment Zeit, um sich überHTTP Strict Transport Security, or HSTS und insbesondere über“preload” functionality zu informieren

Fügen Sie die Konfiguration in die Dateissl-params.confein, die wir geöffnet haben:

/etc/apache2/conf-available/ssl-params.conf

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
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 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

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

Ändern der standardmäßigen virtuellen Apache SSL-Hostdatei

Als Nächstes ändern wir/etc/apache2/sites-available/default-ssl.conf, die Standarddatei für den virtuellen Apache SSL-Host. Wenn Sie eine andere Serverblockdatei verwenden, ersetzen Sie deren Namen in den folgenden Befehlen.

Bevor wir fortfahren, sichern wir die ursprüngliche SSL Virtual Host-Datei:

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

Öffnen Sie nun die SSL Virtual Host-Datei, um Anpassungen vorzunehmen:

sudo nano /etc/apache2/sites-available/default-ssl.conf

Wenn die meisten Kommentare entfernt sind, sollte die Virtual Host-Datei standardmäßig so aussehen:

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


        
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

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

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                
                                SSLOptions +StdEnvVars
                
                
                                SSLOptions +StdEnvVars
                

        

Wir werden einige kleinere Anpassungen an der Datei vornehmen. Wir werden die normalen Einstellungen für eine Virtual Host-Datei vornehmen (ServerAdmin-E-Mail-Adresse, Servername usw.) und die SSL-Anweisungen so anpassen, dass sie auf unsere Zertifikat- und Schlüsseldateien verweisen.

Nach diesen Änderungen sollte Ihr Serverblock ungefähr so ​​aussehen:

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


        
                ServerAdmin [email protected]
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html

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

                SSLEngine on

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

                
                                SSLOptions +StdEnvVars
                
                
                                SSLOptions +StdEnvVars
                

        

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

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 die unverschlüsselte Virtual Host-Datei so anzupassen, dass der gesamte zu SSL-verschlüsselte Datenverkehr umgeleitet wird, können Sie die/etc/apache2/sites-available/000-default.conf-Datei öffnen:

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

Innerhalb derVirtualHost-Konfigurationsblöcke müssen wir eineRedirect-Direktive hinzufügen, die den gesamten Datenverkehr auf die SSL-Version der Site verweist:

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


        . . .

        Redirect "/" "https://your_domain_or_IP/"

        . . .

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

[[Schritt-3 - Anpassen der Firewall]] == Schritt 3 - Anpassen der Firewall

Wenn Sie die Firewall vonufwaktiviert haben, wie in den erforderlichen Anleitungen empfohlen, müssen Sie möglicherweise die Einstellungen anpassen, um SSL-Verkehr zuzulassen. Glücklicherweise registriert Apache bei der Installation einige Profile mitufw.

Wir können die verfügbaren Profile anzeigen, indem wir Folgendes eingeben:

sudo ufw app list

Sie sollten eine Liste wie diese sehen:

OutputAvailable applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

Sie können die aktuelle Einstellung anzeigen, indem Sie Folgendes eingeben:

sudo ufw status

Wenn Sie früher nur normalen HTTP-Datenverkehr zugelassen haben, sieht Ihre Ausgabe möglicherweise folgendermaßen aus:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache                     ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache (v6)                ALLOW       Anywhere (v6)

Um zusätzlich HTTPS-Datenverkehr zuzulassen, können wir das Profil "Apache Full" zulassen und dann die redundante Profilzulassung "Apache" löschen:

sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'

Ihr Status sollte jetzt so aussehen:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)

[[Schritt-4 -–- Aktivieren der Änderungen in Apache]] == Schritt 4 - Aktivieren der Änderungen in Apache

Nachdem wir unsere Änderungen vorgenommen und unsere Firewall angepasst haben, können wir die SSL- und Header-Module in Apache aktivieren, unseren SSL-fähigen virtuellen Host aktivieren und Apache neu starten.

Mit dem Befehla2enmod können wirmod_ssl, das Apache-SSL-Modul undmod_headers aktivieren, die von einigen Einstellungen in unserem SSL-Snippet benötigt werden:

sudo a2enmod ssl
sudo a2enmod headers

Als Nächstes können wir unseren virtuellen SSL-Host mit dem Befehla2ensite aktivieren:

sudo a2ensite default-ssl

Wir müssen auch unseressl-params.conf-Datei aktivieren, um die von uns festgelegten Werte einzulesen:

sudo a2enconf ssl-params

Zu diesem Zeitpunkt sind unsere Site und die erforderlichen Module aktiviert. Wir sollten überprüfen, ob unsere Dateien Syntaxfehler enthalten. Wir können dies tun, indem wir Folgendes eingeben:

sudo apache2ctl configtest

Wenn alles erfolgreich ist, erhalten Sie ein Ergebnis, das so aussieht:

OutputAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

Die erste Zeile ist nur eine Nachricht, die Sie darüber informiert, dass die DirektiveServerNamenicht global festgelegt ist. Wenn Sie diese Nachricht entfernen möchten, können SieServerName auf den Domänennamen oder die IP-Adresse Ihres Servers in/etc/apache2/apache2.conf setzen. Dies ist optional, da die Nachricht keinen Schaden anrichtet.

Wenn Ihre AusgabeSyntax OK enthält, weist Ihre Konfigurationsdatei keine Syntaxfehler auf. Wir können Apache sicher neu starten, um unsere Änderungen zu implementieren:

sudo systemctl restart apache2

[[Schritt 5 - Testen der Verschlüsselung]] == Schritt 5 - Testen der Verschlüsselung

Jetzt können Sie Ihren SSL-Server testen.

Öffnen Sie Ihren Webbrowser und geben Siehttps:// gefolgt vom Domainnamen oder der IP Ihres Servers in die Adressleiste ein:

https://server_domain_or_IP

Da das von uns erstellte Zertifikat nicht von einer der vertrauenswürdigen Zertifizierungsstellen Ihres Browsers signiert ist, wird wahrscheinlich eine beängstigend aussehende Warnung wie die folgende angezeigt:

Apache self-signed cert warning

Dies ist zu erwarten und normal. Wir interessieren uns nur für den Verschlüsselungsaspekt unseres Zertifikats, nicht für die Überprüfung der Authentizität unseres Hosts durch Dritte. Klicken Sie auf "ERWEITERT" und dann auf den angegebenen Link, um trotzdem zu Ihrem Host zu gelangen:

Apache self-signed override

Sie sollten zu Ihrer Site weitergeleitet werden. Wenn Sie in die Adressleiste des Browsers schauen, sehen Sie ein Schloss mit einem „x“ darüber. In diesem Fall bedeutet dies nur, dass das Zertifikat nicht validiert werden kann. Es verschlüsselt immer noch Ihre Verbindung.

Wenn Sie Apache so konfiguriert haben, dass HTTP zu HTTPS umgeleitet wird, können Sie auch prüfen, ob die Umleitung ordnungsgemäß funktioniert:

http://server_domain_or_IP

Wenn das gleiche Symbol angezeigt wird, hat Ihre Umleitung ordnungsgemäß funktioniert.

[[Schritt-6 -–- Ändern zu einer permanenten Weiterleitung]] == Schritt 6 - Wechseln zu einer permanenten Weiterleitung

Wenn Ihre Umleitung ordnungsgemäß funktioniert hat und Sie sicher sind, dass Sie nur verschlüsselten Datenverkehr zulassen möchten, sollten Sie den unverschlüsselten virtuellen Apache-Host erneut ändern, um die Umleitung dauerhaft zu machen.

Öffnen Sie die Konfigurationsdatei für den Serverblock erneut:

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

Suchen Sie die zuvor hinzugefügte ZeileRedirect. Fügen Sie dieser Zeilepermanent hinzu, wodurch die Umleitung von einer temporären 302-Umleitung in eine permanente 301-Umleitung geändert wird:

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


        . . .

        Redirect permanent "/" "https://your_domain_or_IP/"

        . . .

Speichern und schließen Sie die Datei.

Überprüfen Sie Ihre Konfiguration auf Syntaxfehler:

sudo apache2ctl configtest

Wenn Sie bereit sind, starten Sie Apache neu, um die Umleitung dauerhaft zu machen:

sudo systemctl restart apache2

Fazit

Sie haben Ihren Apache-Server so konfiguriert, dass für Clientverbindungen eine starke Verschlüsselung verwendet wird. Auf diese Weise können Sie Anfragen sicher bedienen und verhindern, dass Dritte Ihren Datenverkehr lesen.