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!