[Linux]

https / ssl mit Wildcard Zertifikat für localhost

In einer Development Umgebung ist es immer lästig, wenn man kein https zur Verfügung hat. Mit ein bisschen Konfiguration lassen sich aber Zertifikate selber erstellen und können im Browser importiert werden.

Zunächst sollte man sicherstellen, dass in der /etc/hosts sowohl localhost, als auch der gewünschte Rechnername für die Wildcardzertifikate korrekt konfiguriert ist. Hier ein Beispiel meiner Config mit meinem Hauptrechner misery:


# Static table lookup for hostnames.
# See hosts(5) for details.
127.0.0.1       localhost.localdomain   localhost
::1             localhost.localdomain   localhost
127.0.0.1       misery

Folgende Schritte sollte man alle als root durchführen. Denn auch wenn die Zertifikate die erstellt werden ohnehin nirgends gültig sind und es daher kein Problem wäre, wenn die Schlüssel öffentlich werden würden, arbeitet unser Apache und Linux ja genauso, als wäre es ein öffentlicher Server.

Als erstes legt man eine Textdatei domains.ext an für die Domains, die man zertifizieren möchte. Wichtig hierbei ist, dass man für Wildcard Zertifikate immer drei (3!) Stellen braucht, damit diese in einer lokalen Umgebung funktionieren. Man kann natürlich auch jede Subdomain einzeln auflisten. Das ist aber sehr lästig, weil man sonst die Keys immer wieder neu erstellen müsste, sobald eine Domain hinzu kommt. Ich bevorzuge die Form *.dev.rechnername. Hier ein Beispiel mit meinem Hauptrechner misery:


# domains.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = misery
DNS.3 = *.dev.misery

Dann erstellen wir die SSL Zertifikate und die dazugehörigen Keys:


openssl req -x509 -nodes -new -sha256 -days 1024 -newkey rsa:2048 -keyout MiseryRootCA.key -out MiseryRootCA.pem -subj "/C=US/CN=Misery-Root-CA"
openssl x509 -outform pem -in MiseryRootCA.pem -out MiseryRootCA.crt
openssl req -new -nodes -newkey rsa:2048 -keyout localhost.key -out localhost.csr -subj "/C=US/O=Misery-Certificates/CN=localhost.misery"
openssl x509 -req -sha256 -days 1024 -in localhost.csr -CA MiseryRootCA.pem -CAkey MiseryRootCA.key -CAcreateserial -extfile domains.ext -out localhost.crt

Alle Stellen, an denen mein Rechnername (misery) eingetragen ist, sind natürlich frei konfigurierbar und sollten mit dem eigenen Rechnernamen ersetzt werden.

Konfiguration des Apache Servers

Die Keys für Apache werden dann am besten in den Ordner, in dem sich auch die httpd.conf (oder apache2.conf unter Ubuntu) befindet kopiert. Unter Arch Linux wäre das:


cp localhost.crt /etc/httpd/conf/
cp localhost.key /etc/httpd/conf/

Und unter Ubuntu:


cp localhost.crt /etc/apache2/conf/
cp localhost.key /etc/apache2/conf/

Die Pfade zu diesen beiden Dateien müssen nun in der Apache Config für den default Virtualhost auf SSL Port 443 eingetragen werden. Standardmäßig ist die Config hier zu finden:

Arch Linux/etc/httpd/conf/extra/httpd-ssl.conf
Ubuntu/etc/apache2/sites-available/default-ssl.conf

Innerhalb des VirtualHost Tags müssen dann folgende Zeilen hinzugefügt werden oder die bestehenden Zeilen in der Vorlage editiert und auskommentiert werden.


# Arch Linux
SSLCertificateFile "/etc/httpd/conf/localhost.crt"
SSLCertificateKeyFile "/etc/httpd/conf/localhost.key"

# Ubuntu
SSLCertificateFile "/etc/apache2/conf/localhost.crt"
SSLCertificateKeyFile "/etc/apache2/conf/localhost.key"

Nach dem Neustarten des Apache sollte dieser nun korrekt konfiguriert sein. Da oben ein Wildcard Zertifikat auf die Domain *.dev.misery erstellt wurde, können die Zertifikate auch für weitere VirtualHosts verwendet werden. z.B. für die domain geilomat.dev.misery:


# Arch Linux
<VirtualHost *:443>
    DocumentRoot "/srv/http/geilomat/public"
    ServerName geilomat.dev.misery
    SSLCertificateFile "/etc/httpd/conf/localhost.crt"
    SSLCertificateKeyFile "/etc/httpd/conf/localhost.key"
    ErrorLog "/var/log/httpd/geilomat.dev.misery-error_log"
    CustomLog "/var/log/httpd/geilomat.dev.misery-access_log" common
</VirtualHost>

# Ubuntu
<VirtualHost *:443>
    DocumentRoot "/var/www/geilomat/public"
    ServerName geilomat.dev.misery
    SSLCertificateFile "/etc/apache2/conf/localhost.crt"
    SSLCertificateKeyFile "/etc/apache2/conf/localhost.key"
    ErrorLog "/var/log/apache2/geilomat.dev.misery-error_log"
    CustomLog "/var/log/apache2/geilomat.dev.misery-access_log" common
</VirtualHost>

Verwendung des Zertifikats im Browser

Für diesen Schritt müssen zunächst noch die Zertifikate der "virtuellen" Zertifizierungsstelle in einen Ordner unterhalb der HOME Directory unseres Standardbenutzers kopiert und diesem freigegeben werden:


mkdir /home/username/certificates
cp MiseryRootCA.crt /home/username/certificates/
cp MiseryRootCA.key /home/username/certificates/
cp MiseryRootCA.pem /home/username/certificates/
chown -R username:users /home/username/certificates

Damit der Browser das selbst erstellte Zertifikat auch akzeptiert, muss dieses manuell hinzugefügt werden. z.B. im Firefox:

  • in about:config die Option security.enterprise_roots.enabled auf true setzen
  • in den Einstellungen zur Datenschutz & Sicherheit (about:preferences#privacy) unter "Zertifikate anzeigen" die MiseryRootCA.pem importieren.

oder im Chrome / Chromium:

  • unter chrome://settings/certificates im Reiter "Zertifizierungsstellen" die MiseryRootCA.pem importieren

#apache#linux

L16HT|D@RK
Top