Ein selbstsigniertes SSL Zertifikat in Apache verwenden

TLS (Transport layer security) ist ein Web-Protokoll, mit dem es möglich ist den Datenverkehr zwischen Client und Server zu verschlüsseln. Somit soll es den Stationen dazwischen unmöglich gemacht werden, den Verkehr mitzulesen.

Durch das Zertifikat-System kann man außerdem leichter prüfen, ob der Server mit dem ich mich verbinde, auch wirklich der ist, welcher er vorgibt zu sein. Um das sicherzustellen, gibt es zentrale Zertifizierungsstellen, welche die Identität des Zertifikatsbesitzers prüfen und bestätigen.

Um aber nur den Schritt der Verschlüsselung zu implementieren, muß man nicht unbedingt ein Zertifikat kaufen. Man kann auch ein selbstsigniertes Zertifikat verwenden. Wie das geht, möchte ich euch als Beispiel unter Ubuntu und openssl hier zeigen.

Zu beachten ist, das die Verwendung eines selbstsignierten Zertifikats im Browser eine Warnung auslöst und deshalb für kommerzielle Webseiten nicht geeignet ist. In diesem Fall würde ich auf jeden Fall den Kauf eines Zertifikats bei einer Zertifizierungsstelle (CA – Certificate Authority) empfehlen.

Hat man aber z.B. einen Webserver, der von den Besuchern nicht gesehen wird, kann man selbstsignierte Zertifikate verwenden um die Verschlüsselung sicherzustellen.

1. Erstellung des Zertifikates

Als erstes muß man den privaten Schlüssel und das Zertifikat erstellen. Dies wollen wir mit dem openssl-Tool durchführen. Sollte es am Server noch nicht verfügbar sein, kann man es mit

apt-get install openssl

installieren.

Danach erstellen wir das Zertifikat und den Schlüssel:

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

Man muß einige Fragen beantworten:

-----
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) [AU]:AT
State or Province Name (full name) [Some-State]:Vienna
Locality Name (eg, city) []:Vienna
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Ltd
Organizational Unit Name (eg, section) []: IT
Common Name (e.g. server FQDN or YOUR name) []: intraweb.mycompany.com
Email Address []:

$
  • Country-Name: verwende hier den 2-stelligen ISO-Code (z.B. AT für Österreich, DE für Deutschland). Eine Liste aller Codes gibts hier.
  • Stage or Province Name: Bundesland
  • Locality Name: Stadt
  • Organization Name: Name der Organisation (Firma, Verein,…)
  • Organizational Unit Name: z.B. Abteilung in der Firma
  • Common Name: Hier müßt ihr den Domain-Namen oder die IP-Adresse eures Servers angeben

Da wir ja ein selbst-signiertes Zertifikat erstellen, sind die Angaben hier nicht so besonders wichtig. Im Falle eines öffentlichen Zertifikates wären dies aber Informationen, welche der Besucher der Website zu sehen bekommt, wenn der die Zertifikat-Infos im Browser öffnet.

2. Apache konfigurieren

Nun müssen wir Apache konfigurieren, sodaß er unsere Zertifikat verwendet. Dazu ändern wir die default-ssl.conf Datei im Verzeichnis /etc/apache2/sites-available. Je nach Ubuntu-Version kann diese Datei auch anders heißen, bzw. ihr könnt natürlich auch die Default-Datei kopieren und eine neue Datei anlegen.

Die Datei sollte ungefähr so aussehen:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost
                ServerName intraweb.mycompany.com               

                DocumentRoot /var/www

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

                SSLEngine on

                SSLCertificateFile    /etc/ssl/certs/self-signed.crt
                SSLCertificateKeyFile /etc/ssl/private/self-signed.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                BrowserMatch "MSIE [2-6]" \
                               nokeepalive ssl-unclean-shutdown \
                               downgrade-1.0 force-response-1.0

        </VirtualHost>
</IfModule>

Die beiden Einträge SSLCertificateFile und SSLCertificateKeyFile müssen zu euren zuvor erzeugten Zertifikat- bzw. Schlüssel-Dateien zeigen.

Danach müssen wir die Konfigurations-Datei und das SSL-Modul aktivieren:

$ a2ensite default-ssl.conf
$ a2enmod ssl

Nach einem Neustart des Apache-Server (service apache restart) sollte die Webseite über https erreichbar sein.

Öffnet man die Seite, kommt dann z.B. im Mozilla Firefox folgende Warnung, da es sich um selbstsigniertes Zertifikat handelt: