Inhaltsverzeichnis

Apache Webserver

SSL gesicherter Webserver

Zur Absicherung unserer Privatsphäre bei unserem Webmailers möchten wir doch das Mitlesen unserer Daten (Authentifizierung wie auch Nachrichten) erschwehren. Hierzu nutzen mir das Modul mod_ssl unseres Apache Webservers. Nachfolgende Beschreibung zeigt, wie man unter CentOS 5 einen SSL geschützten virtuellen Host aufsetzen kann.

Installation

Die noch fehlenden Pakete openssl und mod_ssl installieren wir via yum.

 # yum install openssl mod_ssl

Paket-Informationen

Mittels dem Befehl rpm informieren wir uns über den Inhalt der beiden Pakete und über die mitgebrachten Konfigurationsordner.

openssl

Als ersten sehen wir uns das Paket openssl näher an:

# rpm -iql openssl

Name        : openssl                      Relocations: (not relocatable)
...

...
URL         : http://www.openssl.org/
Summary     : Das OpenSSL-Toolkit
Description :
Das OpenSSL-Toolkit liefert Support für die sichere Kommunikation
zwischen Computern. OpenSSL enthält ein zertifiziertes Management-Tool
und gemeinsam genutzte Bibliotheken, die verschiedene kryptografische
Algorithmen und Protokolle zur Verfügung stellen.

/etc/pki/CA
/etc/pki/CA/private
/etc/pki/tls
/etc/pki/tls/cert.pem
/etc/pki/tls/certs
/etc/pki/tls/certs/Makefile
/etc/pki/tls/certs/ca-bundle.crt
/etc/pki/tls/certs/make-dummy-cert
/etc/pki/tls/misc
/etc/pki/tls/misc/CA
/etc/pki/tls/misc/c_hash
/etc/pki/tls/misc/c_info
/etc/pki/tls/misc/c_issuer
/etc/pki/tls/misc/c_name
/etc/pki/tls/openssl.cnf
/etc/pki/tls/private

...

mod_ssl

Die Konfiguration unseres Webserver erfolt über das Paket mod_ssl.

# rpm -iql mod_ssl
Name        : mod_ssl                      Relocations: (not relocatable)
...

...
URL         : http://httpd.apache.org/
Summary     : SSL/TLS Modul für den Apache HTTP Server
Description :
The mod_ssl module provides strong cryptography for the Apache Web
server via the Secure Sockets Layer (SSL) and Transport Layer
Security (TLS) protocols.
/etc/httpd/conf.d/ssl.conf
/usr/lib/httpd/modules/mod_ssl.so
/var/cache/mod_ssl

SSL - Zertifikate

Selbstgeneriertes Zertifikat

Zum ersten Testen und für Anwendungen im Intranet reicht ja unter Umständen ein self-signed certificate.

Privater Schlüssel

Als erstes generieren wir uns einen privaten Schlüssel.

 # openssl genrsa -out pivate.key 1024

Über die Dateiberechtigung schützen wir die Datei vor fremden Blicken.

 # chmod 400 private.key

Dann kopieren wir diesen an die richtige Stelle.

 # cp private.key /etc/pki/tls/private/
Zertifikatsregistrierungsanforderung

Damit unser digitales Zertifikat erstellt werden kann, benötigen wir ein CSR1), eine Textzeichenfolge, die wir mit Hilfe der SSL-Software openssl auf unserem zu zertifizierenden Servers erzeugen. Mit Eingabe eines Punktes . erzeugen wir dabei ein leeres Feld.

# openssl req -new -key private.key -out self-signed-cert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Pliening
Organization Name (eg, company) [My Company Ltd]:Nausch
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) []:webmailer.nausch.org
Email Address []:michael@nausch.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Auch hier passen wir die Dateiberechtigung an.

 # chmod 400 self-signed-cert.csr

Unseren Certificate Signing Request kopieren wir dann nach /etc/pki/tls/private/ .

 # cp self-signed-cert.csr /etc/pki/tls/private/
Selbst signiertes Zertifikat

Zum Schluß erstellen wir uns nun unser eigenes Zertifikat mit Hilfe des Programms openssl.

# openssl x509 -req -days 3650 -in test-ca.csr -signkey private.key -out self-signed-cert.crt
Signature ok
subject=/C=DE/ST=Bayern/L=Pliening/O=Nausch/CN=webmailer.nausch.org/emailAddress=michael@nausch.org
Getting Private key

Wie schon zuvor passen wir auch hier die Berechtigung an.

 # chmod 400 self-signed.crt

Und verschieben unser Zertifikat an die korrekte Stelle im System.

 # cp self-signed-cert.crt /etc/pki/tls/certs

Anschließend löschen wir die nicht mehr benötigen Dateien in unserem Arbeitsverzeichnis.

 # rm private.key
 # rm self-signed-cert.csr

Offizielles Zertifikat

Für die eigentliche Produktivumgebung, im speziellen von verschiedenen Orten/Rechnern mit unterschiedlichen Browsern, ist die Verwendung eines offiziellen Zertifikates angesagt. Als Beispiel eines „bezahlbaren“ Zertifikates sei als Quelle SSL123 Certificate von Thawte genannt.
Die grundlegende Herangehensweise entspricht, die unserem selbstsignierten Testzertifikat.

Privater Schlüssel

Als erstes generieren wir uns einen privaten Schlüssel.

 # openssl genrsa -out pivate.key 1024

Über die Dateiberechtigung schützen wir die Datei vor fremden Blicken.

 # chmod 400 private.key

Dann kopieren wir diesen an die richtige Stelle.

 # cp private.key /etc/pki/tls/private/
Zertifikatsregistrierungsanforderung

Damit von Thawte unser digitales Zertifikat erstellt werden kann, benötigen wir ein CSR2), eine Textzeichenfolge, die wir mit Hilfe der SSL-Software openssl auf unserem zu zertifizierenden Servers erzeugen. Mit Eingabe eines Punktes . erzeugen wir dabei ein leeres Feld.

# openssl req -new -key private.key -out self-signed-cert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Pliening
Organization Name (eg, company) [My Company Ltd]:Nausch
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) []:webmailer.nausch.org
Email Address []:michael@nausch.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Auch hier passen wir die Dateiberechtigung an.

 # chmod 400 self-signed-cert.csr

Unseren Certificate Signing Request kopieren wir dann nach /etc/pki/tls/private/ .

 # cp self-signed-cert.csr /etc/pki/tls/private/

Den Inhalt unseres CSR schicken wir nun Thawte, bzw. geben den Inhalt der Datei im Browserfenster bei der Bestellung ein.

offizielles "Thawte" signiertes Zertifikat

Von Thawte erhalten wir dann unser Zertifikat, welches wir in einer einfachen Textdatei auf unserem Server ablegen.

 # vim /etc/pki/tls/certs/unser-offizieller-host.crt

Auch hier passen wir die Datei-Berechtigung an.

 # chmod 400 /etc/pki/tls/certs/unser-offizieller-host.crt

Anschließend löschen wir die nicht mehr benötigen Dateien in unserem Arbeitsverzeichnis.

 # rm private.key
 # rm self-signed-cert.csr

SSL Zusatzbefehle

Inhalt eines Zertifikates anzeigen (DER, PEM bzw. NET):

 # openssl x509 -in filename -text -inform DER

Konvertierung vom DER ins PEM Format

 # openssl x509 -in infile.name -inform DER -out outfile.name -outform PEM

Mit einem HTTPS-Server verbinden und sich das Certifikat und dessen Zertifikatskette anzeigen lassen.

 # openssl s_client -showcerts -connect www.m-net.de:443

Konfiguration

Apache

Als erstes geben wir nun unserem System unsere Daten zum erstelten Zertifikat bekannt. Diese erden in der Datei /etc/httpd/conf.d/ssl.conf eingetragen.

# vim /etc/httpd/conf.d/ssl.conf
ssl.conf
...
#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/certs/self-signed-cert.crt
 
#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/private.key
 
...

VHost

Am Anfang unserer VHost-Konfigurationsdatei /etc/httpd/conf.d/vhosts.conf tragen wir die Option NameVirtualHost *:443 ein.

# vim /etc/httpd/conf.d/vhosts.conf
vhosts.conf
# This configuration file enables the vhosts to this Server
 
NameVirtualHost *:80
NameVirtualHost *:443
...

Bei der Definition unseres VHost geben wir an:

# vim /etc/httpd/conf.d/vhosts.conf
vhosts.conf
...
#
# webmailer.nausch.org
# ssl verschlüsselt
#
<VirtualHost *:443>
        SSLEngine on
        SSLCertificateFile /etc/pki/tls/certs/self-signed-cert.crt
        SSLCertificateKeyFile /etc/pki/tls/private/private.key
        ServerName webmailer.nausch.org:443
        ServerAdmin webmaster@nausch.org
 
...

Anschließend starten wir unseren Webmailer einmal durch, damit dieser unsere Änderungen übernehmen kann.

Paketfilter

Damit unser Webserver Anfragen auf Port 443 auch annehmen kann, öffnen wir noch den Port im Paktefilter.

 # vim /etc/sysconfig/iptables
  1. A INPUT -i eth3 -p tcp -m state –state NEW -m tcp –dport 443 -j ACCEPT

Ein restart unserer Firewall öffnet schließlich den Port.

 # service iptables restart

Überaus nette Zeitgenossen meinen zu Weilen, Inhalte eines Webservers für eigene Zwecke ohne Authorisierung zu verwenden. In der Regel werden dabei Graphiken geklaut. Dies unterbinden wir durch eine kleine Änderung in unserer Konfiguration.

VHost anpassen

In unserer VHostdefinition „erlauben“ wir die Verwendung der .htaccess durch folgenden Eintrag in der _Directory_Directive_.

 AllowOverride All

Anschließend starten wir unseren Apache-Webserver einmal durch.

.htaccess

In unserem V-Host Verzeichnis legen wir uns nun eine Datei .htaccess an.

#  vim .htaccess
.htaccess
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://meine.domäne.de/.*$ [NC]
RewriteCond %{REQUEST_FILENAME} \.(jpg|gif|png)$
RewriteRule ^.*$ - [F]

Erfolgskontrolle

Wenn wir nun mit unserem Browser der Wahl die Seite unseres Content-Diebes aufrufen, können wir nun feststellen, dass in dem gezeigten Beispiel, die Deeplinks auf Bilder in unserem Webangebot erfolgreich unterbunden werden!

Links

1) , 2)
Certificate Signing Request