SSL-Verschlüsselung und HTTPS für Apache 2 oder Nginx Webserver erzwingen
Bevor Sie diese Schritte nachvollziehen, sollten Sie meinen Einführungspost über die Einrichtung von SSL-Verschlüsselung lesen. Wenn Sie mehrere Domains auf einem einzigen physikalischen Server betreiben, sollten Sie sich außerdem den Post über SNI SSL ansehen.
Inhaltsverzeichnis
Apache 2
Lösung über Redirect SSL
Zunächst müssen wir sicherstellen, dass im Apache 2 das SSL-Modul aktiviert ist
sudo a2enmod ssl sudo a2enmod headers sudo service apache2 force-reload
Als erstes müssen wir inn der /etc/apache2/ports.conf festlegen, dass der Apache 2 bei aktivierem SSL-modul auf den port 443 (und andere gewüsnchte SSL-ports wie beispielsweise 8443) hören soll.
Listen 80 <IfModule ssl_module> Listen 443 https </IfModule> <IfModule mod_ssl.c> Listen 443 https </IfModule> <IfModule mod_gnutls.c> Listen 443 https </Ifmodule>
Dann müssen Sie einmal in der in der /etc/apache2/sites-available/000-default.conf eine VirtaulHost-Direktive für den Port 80 bearbeiten
<VirtualHost *:80> Servername <FQDN> Redirect permanent / https://<FQDN> ServerAdmin <Ihre E-Mail> #DocumentRoot /var/www (auskommentiert) </VirtualHost>
dann müssen Sie die /etc/apache2/sites-available/default-ssl.conf (oder falls diese nicht vorhanden in einer neuen Datei namens ssl.conf) editieren
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
DocumentRoot /var/www
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog &{APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLRequireSSL
SSLCertificateFile /pfad/zum/zertfiikat.pem
SSLCertificateKeyFile /Pfad/zum/Key.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE {17-9]" ssl-unclean-shutdown
</VirtualHost>
Header always set Strict-Transport-Security "mag-age=31536000; includeSubDomains"
</IfModule>
Nach Abschluss der Konfiguration müssen wir noch folgende Befehle eingeben
sudo a2ensite default-ssl sudo a2ensite (weitere namen von konfigurationsdateien unter /etc/apache2/sites-available) sudo /etc/init.d/apache2 reload sudo service apache2 restart
Lösung über mod_rewrite
als erstes muss das Apache Modul rewrite zusammen mit dem Modul ssl aktiviert werden.
sudo a2enmod rewrite sudo a2enmod ssl sudo service apache2 force-reload
Als erstes müssen wir inn der /etc/apache2/ports.conf festlegen, dass der Apache 2 bei aktivierem SSL-modul auf den port 443 (und andere gewüsnchte SSL-ports wie beispielsweise 8443) hören soll.
Listen 80 <IfModule ssl_module> Listen 443 https </IfModule> <IfModule mod_ssl.c> Listen 443 https </IfModule> <IfModule mod_gnutls.c> Listen 443 https </Ifmodule>
Dann müssen Sie einmal in der in der /etc/apache2/sites-available/000-default.conf eine VirtaulHost-Direktive für den Port 80 bearbeiten
<VirtualHost *:80>
Servername <FQDN>
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
ServerAdmin <Ihre E-Mail>
#DocumentRoot /var/www (auskommentiert)
</VirtualHost>
dann müssen Sie die /etc/apache2/sites-available/default-ssl.conf (oder falls diese nicht vorhanden in einer neuen Datei namens ssl.conf) editieren
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
DocumentRoot /var/www
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog &{APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLRequireSSL
SSLCertificateFile /pfad/zum/zertfiikat.pem
SSLCertificateKeyFile /Pfad/zum/Key.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE {17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
Nach Abschluss der Konfiguration müssen wir noch folgende Befehle eingeben
sudo a2ensite default-ssl sudo a2ensite (weitere namen von konfigurationsdateien unter /etc/apache2/sites-available) sudo /etc/init.d/apache2 reload sudo service apache2 restart
Nginx
genau wie der apache2 wird auch Nginx über Module kontrolliert, deren Konfiguration in From von Direktiven in Konfigurationsdatieen festgelegt wird. Die Konfiguration kann wie beim Apache auf mehrere Dateien verteilt sein, die isch normalerweise unter /etc/nginx befinden. Meist gibt es jedoch nur eine einzige Datei mit Namen /etc/nginx/nginx.conf.
Eine erzwungende Weiterelitung auf https:// können Sie auf dem nginx einfach über folgende Direktive festlegen
server {
listen 80;
listen [::]:80;
server_name <FQDN>
return 301 https://$server_name$request_uri;
}
server {
listen 443 default_server ssl;
server_name <FQDN>;
ssl_certificate /path/to/my/cert;
ssl_certificate_key /path/to/my/key;
}
Eine schlechtere ÖLsung, die allerdings auch grundsätzlich geht:
server {
listen 80;
listen [::]:80;
listen 443 default ssl;
server_name = <FQDN>;
#if ($ssl_protocol = "") {
#rewrite ^/(.*) https://$server_name/$1 #permanent;
#}
#oder
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
}
}
Eine schlechtere Lösung, die allerdings auch grundsätzlich geht:
server {
listen 80;
listen 443 default ssl;
server_name = <FQDN>;
return 301 https://<FDQN>$request_uri;
ssl_certificate /<pfad>;
ssl_certificate_key /<Pfad>;
eine shlechtere lösung, die allerdigns auch grundsätzlich geht:
server {
listen 80;
listen 443 default ssl;
server_name <FQDN>;
rewrite ^ https://$server_name$request_uri? permanent;
ssl_certificate /<pfad>;
ssl_certificate_key /<Pfad>;
}
Andreas Loibl ist SAP-Berater, Ethical Hacker und Online Marketing Manager und schreibt auf seinem Blog DaFRK Blog über verschiedene Themen in den Sektoren Projektmanagement, Informationstechnik, Persönlichkeitsentwicklung, Finanzen und Zeitmanagement.
Hi,
danke für die ausführlichen Informationen. Jetzt bin ich endlich einen Schritt weiter.
Grüße
Dennis