2016-12-24 2 views
1

Ich habe so etwas wie 100 ähnliche Websites in zwei VPS '. Ich möchte Haproxy verwenden, um Verkehr dynamisch zu schalten, aber in der gleichen Zeit möchte ich ssl Zertifikat hinzufügen.Dynamisch SSL-Konfiguration in Haproxy für mehrere Domänen

Ich möchte eine Variable hinzufügen, um das spezifische Zertifikat für jede Website aufzurufen. Zum Beispiel:

frontend web-https 
    bind 0.0.0.0:443 ssl crt /etc/ssl/certs/{{domain}}.pem 
    reqadd X-Forwarded-Proto:\ https 
    rspadd Strict-Transport-Security:\ max-age=31536000 
    default_backend website 

prüfe ich auch möchte, wenn die ssl reale verfügbar ist und falls nicht verfügbar Schalter auf http mit einer Umleitung.

Ist dies mit HaProxy möglich?

Antwort

4

Dies kann getan werden, aber TLS (SSL) erlaubt Ihnen nicht, es so zu tun, wie Sie es sich vorstellen.

Zunächst können Sie in HAProxy ein Standardzertifikat und ein Verzeichnis für zusätzliche Zertifikate angeben.

Vom documentation for the crt keyword

Wenn ein Verzeichnisname anstelle einer PEM-Datei verwendet wird, dann werden alle Dateien in gefunden, dass Verzeichnis wird in alphabetischer Reihenfolge geladen werden, wenn ihr Name mit ‚.issuer‘ endet, '.ocsp' oder '.sctl' (reservierte Erweiterungen). Diese Direktive kann mehrfach angegeben werden, um Zertifikate aus mehreren Dateien oder Verzeichnissen zu laden. Die Zertifikate werden Clients angezeigt, die ein gültiges TLS Server Name Indication-Feld angeben, das einem ihrer CN- oder alt Subjekte entspricht. Wildcards werden unterstützt, wobei ein Platzhalterzeichen '*' anstelle der ersten Hostnamen-Komponente verwendet wird (zB: * .example.org stimmt mit www.example.org überein, aber nicht mit www.sub.example.org).

Wenn kein SNI vom Kunden zur Verfügung gestellt wird, oder wenn die SSL-Bibliothek unterstützt nicht TLS Erweiterungen oder wenn der Client einen SNI Hostnamen bereitstellt, die jedes Zertifikat nicht Spiel der Fall ist, dann wird das erste geladene Zertifikat präsentiert. Das bedeutet, dass beim Laden von Zertifikaten aus einem Verzeichnis empfohlen wird, zuerst den Standardnamen als Datei zu laden oder sicherzustellen, dass immer der erste Eintrag im Verzeichnis ist.

Also, alles, was Sie brauchen, ist ein Verzeichnis jeden cert/chain/Schlüssel in einer pem-Datei und eine Änderung an der Konfiguration wie folgt enthält:

bind 0.0.0.0:443 ssl crt /etc/haproxy/my-default.pem crt /etc/haproxy/my-cert-directory 

Hinweis Sie auch no-sslv3 hinzufügen sollen.

ich eine Variable hinzufügen, verwenden möchten, für jede Website

Wie in der Dokumentation festgestellt, wenn der Browser sendet Server Name Identification (SNI), dann HAProxy wird te spezifische Zertifikat rufen automatisch verhandeln Sie mit dem Browser mit dem entsprechenden Zertifikat.

So konfigurierbare Cert-Auswahl ist nicht notwendig, aber noch wichtiger ist es nicht möglich. SSL/TLS funktioniert nicht (überall).Bis der Browser den sicheren Kanal erfolgreich aushandelt, wissen Sie nicht, welche Website der Browser anfordern wird, da der Browser die Anfrage noch nicht gesendet hat.

Wenn der Browser SNI nicht spricht - ein Problem, das fast völlig irrelevant sein sollte - oder wenn kein Zertifikat in einer Datei vorhanden ist, die mit dem im SNI angegebenen Hostnamen übereinstimmt - wird das Standardzertifikat verwendet zur Verhandlung mit dem Browser.

Ich mag würde auch prüfen, ob die ssl reale verfügbar ist und falls nicht verfügbar Schalter auf http mit einem Redirect

Dies ist auch nicht möglich. Denken Sie daran, dass zuerst die Verschlüsselung ausgehandelt wird und erst dann die HTTP-Anfrage vom Browser gesendet wird.

So wird ein Benutzer Ihre Weiterleitung nur sehen, wenn sie die Sicherheitswarnung des Browsers umgehen - die sie unbedingt sehen müssen, weil der Hostname im Standardzertifikat nicht mit dem Hostnamen übereinstimmt, den der Browser im cert erwartet.

An dieser Stelle ist es wenig sinnvoll, sie wieder auf http zu setzen, da sie unter Umgehung der Sicherheitswarnung des Browsers eine Verbindung hergestellt haben, die - gleichzeitig - nicht vertrauenswürdig und dennoch verschlüsselt ist. Die Verbindung ist technisch sicher, aber der Benutzer hat ein rotes × in der Adressleiste, weil der Browser korrekt glaubt, dass das Zertifikat ungültig ist (aufgrund der Nichtübereinstimmung des Hostnamens). Wenn der Benutzer jedoch darauf besteht, die Warnung zu umgehen, verwendet der Browser weiterhin das ungültige Zertifikat, um den sicheren Kanal einzurichten.

Wenn Sie nach all dem wirklich weiterleiten möchten, sollten Sie sich die layer 5 fetches ansehen. Sie müssen überprüfen, ob der Header Host mit dem SNI oder dem Standard-Cert übereinstimmt, und wenn es sich bei Ihren Certs um Wildcards handelt, müssen Sie dies ebenfalls berücksichtigen. Dies geschieht jedoch nur . Nach umgeht der Benutzer die Sicherheitswarnung.

Stellen Sie sich vor, wenn die Dinge so einfach wäre, dass ein Web-Server ohne gültiges Zertifikat Verkehr ohne den Browser einfach durch Umleitung es kapern konnte das Zertifikat des Servers gültig (oder vorsätzliche Aktion durch den Benutzer die Warnung zu umgehen) erforderlich ist, und es sollte sich offensichtlich, warum Ihre ursprüngliche Idee nicht nur nicht funktioniert, sondern tatsächlich nicht funktionieren sollte.

Beachten Sie auch, dass die aus dem konfigurierten Verzeichnis geladenen Zertifikate beim Start geladen werden. Wenn Sie HAProxy benötigen, um neue zu entdecken oder alte zu verwerfen, benötigen Sie einen Neustart von HAProxy (normalerweise sudo service haproxy reload).

Verwandte Themen