Let’s Encrypt ist eine Zertifizierungsstelle, die von der Internet Security Research Group (ISRG) gegründet wurde. Es bietet kostenlose SSL-Zertifikate über einen vollständig automatisierten Prozess, der die manuelle Erstellung, Validierung, Installation und Erneuerung von Zertifikaten überflüssig macht.
Von Let’s Encrypt ausgestellte Zertifikate sind 90 Tage ab Ausstellungsdatum gültig und werden heute von allen gängigen Browsern als vertrauenswürdig eingestuft.
Dieses Tutorial erklärt, wie man ein kostenloses SSL-Zertifikat von Let’s Encrypt auf Ubuntu 20.04 installiert, auf dem Apache als Webserver ausgeführt wird. Wir zeigen auch, wie Sie Apache für die Verwendung des SSL-Zertifikats konfigurieren und HTTP/2 aktivieren.
Voraussetzungen #
Stellen Sie sicher, dass die folgenden Voraussetzungen erfüllt sind, bevor Sie fortfahren:
- Angemeldet als root oder Benutzer mit sudo-Berechtigungen.
- Die Domain, für die Sie das SSL-Zertifikat erhalten möchten, muss auf Ihre öffentliche Server-IP verweisen. Wir verwenden
example.com
. - Apache installiert.
Installieren von Certbot #
Wir verwenden certbot, um das Zertifikat zu erhalten. Es ist ein Befehlszeilentool, das die Aufgaben zum Abrufen und Erneuern von SSL-Zertifikaten von Let’s Encrypt automatisiert.
Das certbot-Paket ist in den Standard-Ubuntu-Repositories enthalten. Aktualisieren Sie die Paketliste und installieren Sie certbot mit den folgenden Befehlen:
sudo apt update
sudo apt install certbot
Generiere Strong Dh (Diffie-Hellman) Gruppe #
Der Diffie-Hellman-Schlüsselaustausch (DH) ist eine Methode zum sicheren Austausch kryptografischer Schlüssel über einen ungesicherten Kommunikationskanal. Generieren Sie einen neuen Satz von 2048-Bit-DH-Parametern, um die Sicherheit zu erhöhen:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Sie können die Größe auf bis zu 4096 Bit ändern, aber die Generierung kann je nach Systementropie mehr als 30 Minuten dauern.
Ein SSL-Zertifikat von Let’s Encrypt erhalten #
Um ein SSL-Zertifikat für die Domäne zu erhalten, verwenden wir das Webroot-Plug-in, das eine temporäre Datei zur Validierung der angeforderten Domäne in ${webroot-path}/.well-known/acme-challenge
Verzeichnis. Der Let’s Encrypt-Server stellt HTTP-Anforderungen an die temporäre Datei, um zu überprüfen, ob die angeforderte Domäne zu dem Server aufgelöst wird, auf dem certbot ausgeführt wird.
Um es einfacher zu machen, werden wir alle HTTP-Anfragen für .well-known/acme-challenge
abbilden in ein einziges Verzeichnis, /var/lib/letsencrypt
.
Führen Sie die folgenden Befehle aus, um das Verzeichnis zu erstellen und es für den Apache-Server beschreibbar zu machen.
sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
Um doppelten Code zu vermeiden und die Konfiguration wartungsfreundlicher zu gestalten, erstellen Sie die folgenden zwei Konfigurationsausschnitte:
/etc/apache2/conf-available/letsencrypt.confAlias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"
<Directory "/var/lib/letsencrypt/">
AllowOverride None
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>
/etc/apache2/conf-available/ssl-params.confSSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
Header always set Strict-Transport-Security "max-age=63072000"
Das obige Snippet verwendet die von Mozilla empfohlenen Chipper, aktiviert OCSP Stapling, HTTP Strict Transport Security (HSTS) und erzwingt wenige sicherheitsorientierte HTTP-Header.
Stellen Sie vor dem Aktivieren der Konfigurationsdateien sicher, dass sowohl mod_ssl
und mod_headers
werden durch Ausgabe von:
sudo a2enmod ssl
sudo a2enmod headers
Aktivieren Sie als Nächstes die SSL-Konfigurationsdateien, indem Sie die folgenden Befehle ausführen:
sudo a2enconf letsencrypt
sudo a2enconf ssl-params
Aktivieren Sie das HTTP/2-Modul, das Ihre Websites schneller und stabiler macht:
sudo a2enmod http2
Laden Sie die Apache-Konfiguration neu, damit die Änderungen wirksam werden:
sudo systemctl reload apache2
Wir können jetzt das Certbot-Tool mit dem Webroot-Plugin ausführen und die SSL-Zertifikatsdateien abrufen:
sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Wenn das SSL-Zertifikat erfolgreich erhalten wurde, druckt certbot die folgende Nachricht:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2020-10-06. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Nachdem Sie nun über die Zertifikatsdateien verfügen, bearbeiten Sie die Konfiguration Ihres virtuellen Domänenhosts wie folgt:
/etc/apache2/sites-available/example.com.conf<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
Protocols h2 http/1.1
<If "%{HTTP_HOST} == 'www.example.com'">
Redirect permanent / https://example.com/
</If>
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# Other Apache Configuration
</VirtualHost>
Mit der obigen Konfiguration erzwingen wir eine HTTPSand-Weiterleitung von www zu einer nicht-www-Version. Fühlen Sie sich frei, die Konfiguration an Ihre Bedürfnisse anzupassen.
Laden Sie den Apache-Dienst neu, damit die Änderungen wirksam werden:
sudo systemctl reload apache2
Sie können Ihre Website jetzt mit https://
öffnen , und Sie werden ein grünes Schlosssymbol bemerken.
Wenn Sie Ihre Domain mit dem SSL Labs Server Test testen, erhalten Sie die Note A+, wie unten gezeigt:
SSL-Zertifikat von Let’s Encrypt automatisch verlängern #
Die Zertifikate von Let’s Encrypt sind 90 Tage gültig. Um die Zertifikate automatisch zu erneuern, bevor sie ablaufen, erstellt das certbot-Paket einen Cronjob, der zweimal täglich ausgeführt wird und automatisch jedes Zertifikat 30 Tage vor seinem Ablauf verlängert.
Sobald das Zertifikat erneuert ist, müssen wir auch den Apache-Dienst neu laden. Hängen Sie --renew-hook "systemctl reload apache2"
an zu /etc/cron.d/certbot
Datei so, dass sie wie folgt aussieht:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload apache2"
Um den Verlängerungsprozess zu testen, können Sie den certbot --dry-run
verwenden Schalter:
sudo certbot renew --dry-run
Wenn keine Fehler vorliegen, bedeutet dies, dass der Erneuerungsprozess erfolgreich war.