Martin Döring

SSL Wildcard Zertifikat selbst erstellen

Will man die eigene Website nicht über das ungeschützte http-Protokoll erreichen, sondern über das geschützte https, dann benötigt man ein SSL-Zertifikat. Früher war das eine ziemlich teure Angelegenheit, denn die Zertifizierungsstellen (CAs) haben sich das gut bezahlen lassen.

Seit Ende 2015 gibt es nun Letsencrypt, die ist eine freie und kostenlose CA, die zusätzlich auch noch eine Automatisierung mitbringt - die Zertifikate auf Deiner Webseite werden automatisch alle drei Monate ersetzt gegen aktuelle, diese laufen also quasi nie ab.

Sollen nicht Fremde auf die Website zugreifen, sondern nur man selbst, kann man auch selbstsignierte Zertifikate verwenden - sich selbst traut man in der Regel ja. Käufliche Zertifikate sollen hingegen zusätzlich gewährleisten, dass die Angaben in einem Zertifikat auch korrekt sind. Will man aber nur das selbstinstallierte Webmail oder die eigene OwnCloud vor dem Mitlesen schützen, so muss man kein Geld ausgeben.

Vorgaben

Damit klar ist, was und wofür wir das alle tun, hier zunächst die Vorgaben:

  1. Die Domain heißt in diesem Beispiel datenbrei.de.
  2. Wir haben einen Webserver mit virtuellen Hosts, also mit einigen Subdomains, wie zum Beispiel mail.datenbrei.de, cloud.datenbrei.de, www.datenbrei.de, ...
  3. Wir wollen kein Geld für ein Zertifikat ausgeben, sondern machen alles selbst (selfsigned certificate).
  4. Wir sind uns darüber im Klaren, dass dies für andere Nutzer unseres Webservers etwas unkomfortabel ist, weil unser selbst-signiertes Zertifikat ja nicht "offiziell" in seiner Echtheit bestätigt ist. Ein Benutzer muss also für unsere Website in seinem Browser eine "Ausnahme" einrichten - der Browser lehnt die Verwendung von selbstsignieren Zertifikaten nämlich zunächst einfach ab, denn da könnte ja jeder kommen. Am Besten eignet sich dieses Verfahren also, wenn wir nur selber zugreifen oder innerhalb der Familie.
  5. Ich verwende Debian Linux als Betriebssystem.

Zertifikate erzeugen

So geht es in Kürze:

openssl genrsa -out private.key
openssl req -new -key private.key -out server.crt

Gib jetzt *.yourdomain.de als "Common Name" ein, also mit Sternchen, damit es später für alle Subdomains funktioniert.

openssl x509 -req -days 3650 -in server.crt -signkey private.key -out datenbrei.crt
openssl rsa -in private.key -out datenbrei.key

Die einzelnen Schritte erklärt

Zunächst einen privaten Client-Schlüssel erzeugen, Standardlänge ist 2048 bit:

openssl genrsa -out private.key

Nun erzeugen wir einen sogenannten Certificate Signing Request (CSR) an die (eigene nicht wirklich vorhandene) CA, signiert mit dem oben gebauten Schlüssel:

openssl req -new -key private.key -out server.crt

Jetzt tun wir so, als wären wir eine CA und signieren unseren eigenen Request mit unserem eigenen privaten Schlüssel:

openssl x509 -req -days 3650 -in server.crt -signkey private.key -out datenbrei.crt

Und jetzt bauen wir uns noch einen öffentlichen Schlüssel, von unserem privaten:

openssl rsa -in private.key -out datenbrei.key

Apache konfigurieren

Nachdem wir nun unsere Schlüssel haben, müssen wir noch den Apache so konfigurieren, dass er auch https nutzen kann. Ich gehe hier immer davon aus, dass wir als root arbeiten. Sonst muss jeweils "sudo" vorangestellt werden.

Zunächst muss das SSL-Modul eingeschaltet werden:

a2enmod ssl
service apache2 force-reload 

Jetzt benötigen wir in der Konfig-Datei unserer Domain, z.B: /etc/apache2/sites-available/datenbrei.conf, einen dedizierten Eintrag für jede Sub-Domain mit ihren jeweiligen Verzeichnissen, Beispiel:

<VirtualHost news.datenbrei.de:443>
ServerName news.datenbrei.de:443
ServerAdmin martin@datenbrei.de
DocumentRoot /var/www/de.datenbrei.news
<Directory /var/www/de.datenbrei.news>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/datenbrei-news-error.log
CustomLog ${APACHE_LOG_DIR}/datenbrei-news-access.log combined
SSLEngine on
SSLCertificateFile /root/ssl/datenbrei.crt
SSLCertificateKeyFile /root/ssl/datenbrei.key
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog ${APACHE_LOG_DIR}/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

Nun muss die neue Konfig noch geladen werden:

a2ensite datenbrei.conf
service apache2 force-reload 

Links