Self signed SSL certificate with Nginx in a Vagrant box

Es hat mich eine Weile gekostet, bis ich für dieses Problem eine Lösung gefunden hatte. Dabei habe ich sehr lang an der falschen Stelle gesucht. Ich dachte, ich habe die Zertifikate nicht richtig erstellt, stattdessen war Vagrant nicht korrekt konfiguriert.

ACHTUNG: Selbst signierte Zertifikate nur für die Entwicklung einsetzen!

Selbstsigniertes passwortloses Zertifikat erstellen

openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Kommandos aus diesem Blogpost. Dort gibt es auch eine genauere Erklärung. Nginx dann so konfigurieren, dass diese Zertifikate benutzt werden.

Vagrant konfigurieren

Das ist der wichtige Part. Mit einfacher Portweiterleitung geht es nicht, weil man den SSL Port 443 des Gastsystems auf einen anderen Port des Hostsystems weiterleiten müsste. Damit kommen aber die Browser nicht klar und werfen folgende Fehlermeldung:

Chrome / Chromium

SSL-Verbindungsfehler
Es kann keine sichere Verbindung zum Server hergestellt werden.
Möglicherweise liegt ein Problem mit dem Server vor oder es ist ein
Client-Authentifizierungszertifikat erforderlich, das Sie nicht haben.
Fehler 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL-Protokollfehler

Firefox

Fehler: Gesicherte Verbindung fehlgeschlagen

Ein Fehler ist während einer Verbindung mit local.gigmit.com:8080 aufgetreten.

SSL hat einen Eintrag erhalten, der die maximal erlaubte Länge überschritten hat.

(Fehlercode: ssl_error_rx_record_too_long)

Stattdessen alle Portweiterleitungen aus der Vagrantfile entfernen und ein privates Netzwerk benutzen. (Vagrant Docs)

Vagrant.configure('2') do |config|
  # ...
  config.vm.network :private_network, ip: '172.31.172.172'
  # ...
end

Die IP Adresse kann frei gewählt sein, sollte aber eine aus dem für private Zwecke reservierten Bereich sein. (Wikipedia)

Eure /etc/hosts Datei anpassen und die gewählte IP eintragen, z.B. so

172.31.172.172 local.mycompany.dev

Die Box mit dieser Einstellung (neu)starten und der Browser sollte euch korrekt auf ein unsigniertes Zertifikat hinweisen, wenn ihr https://local.mycompany.dev ansurft. Yeah!