Wie umgehen mit gemischtem Inhalt in eine website, die gesichert werden soll, wie https?
Baue ich eine Webseite auf server A (mit domain-Namen registriert), für die Menschen zu schaffen und führen Ihre "apps".
Diese "apps" sind eigentlich docker-Container läuft auf server B in den Behälter, dort lebt eine kleine web-app, die direkt zugegriffen werden kann wie:
http://IP_ADDR_OF_SERVER_B:PORT
HAFEN ist eine zufällige, große Zahl ein, welche Karten, um die docker-container.
Jetzt kann ich SSL-Zertifikat arbeiten auf dem server Ein, so dass es funktioniert durch den Zugriff auf:
https://DOMAIN_NAME_OF_SERVER_A
Das problem ist, ich eingeschlossen, die "apps" im iframe, indem Sie auf "http" wie oben, also mein browser(Chrome) zu verweigern, um es zu öffnen und Fehler melden:
Mixed Content: The page at 'https://DOMAIN_NAME_OF_SERVER_A/xxx' was loaded over HTTPS, but requested an insecure resource 'http://IP_ADDR_OF_SERVER_B:PORT/xxx'. This request has been blocked; the content must be served over HTTPS.
So, wie soll ich umgehen mit einem solchen Problem?
Ich bin ein full-stack grüne hand, würde ich schätzen es sehr, wenn Sie teilen können, einige Kenntnisse, wie man eine gesunde https-website, während die Lösung solcher problem in der richtigen Weise.
Ergänzende Erklärung
Ok, ich denke, dass ich nur warf die Umrisse der Frage, hier geht es mehr details.
Ich sehe, es ist intakt und gerade nach vorne, um die iframe-Anfragen bedient werden, die mit https, dann wird es nicht verwirren Sie mich nicht mehr.
Aber das Problem ist, da alle "apps" werden dynamisch erzeugt/entfernt, es scheint, ich werde vorbereiten müssen viele Zertifikate für jeden einzelnen von Ihnen.
Wird selbst signiertes Zertifikat zu arbeiten, ohne blockiert zu werden oder sich beschwert werden, die vom browser? Oder muss ich eine Möglichkeit haben, dienen alle "apps" mit einem SSL-Zertifikat?
Software-Umgebung
Server Ein: Running node.js website hören auf port 5000 und serviert mit Nginx proxy_pass.
server {
listen 80;
server_name DOMAIN_NAME_OF_SERVER_A;
location /{
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:5000;
}
}
server {
listen 443;
server_name DOMAIN_NAME_OF_SERVER_A;
ssl on;
ssl_certificate /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_A.cer;
ssl_certificate_key /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_A.key;
ssl_session_timeout 5m;
location /{
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:5000;
}
}
Server B: Running node.js apps hören von unterschiedlichen random-big-port-Nummern wie 50055, dynamisch zugewiesen, wenn "apps" erstellt. (In der Tat diese Anwendungen laufen, in docker-Containern während ich denke, es spielt keine Rolle) ausführen Können, Nginx, wenn nötig.
Server Ein und Server B sprechen mit einander in den öffentlichen Verkehr.
Lösung
So wie all die Antworten, besonders die von @eawenden, ich brauche einen reverse proxy, um meine Absicht zu erreichen.
Zusätzlich habe ich noch ein paar weitere Sachen:
1. Domain-Namen zuordnen zu Server B für die Verwendung einer letsencrypt cert.
2. Proxy-vordefinierte url zu bestimmten port.
Daher richte ich einen reverse-proxy-server mit nginx auf Server B, proxy alle Anfragen wie:
https://DOMAIN_NAME_OF_SERVER_B/PORT/xxx
zu
https://127.0.0.1:PORT/xxx
Ps: nginx-reverse-proxy-config auf Server B
server {
listen 443;
server_name DOMAIN_NAME_OF_SERVER_B;
ssl on;
ssl_certificate /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_B.cer;
ssl_certificate_key /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_B.key;
ssl_session_timeout 5m;
rewrite_log off;
error_log /var/log/nginx/rewrite.error.log info;
location ~ ^/(?<port>\d+)/{
rewrite ^/\d+?(/.*) $1 break;
proxy_pass http://127.0.0.1:$port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
So scheint alles zu funktionieren wie erwartet!
Nochmals vielen Dank an alle Beantworter.
Ich möchte noch hinzufügen, einige Ergänzende Erklärung zu meiner Frage.
Super, vielen Dank für Ihre Lösung! Es ist Arbeit!
InformationsquelleAutor librae | 2017-01-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie andere gesagt haben, Sie sollten dazu dienen, alle Inhalte über HTTPS.
Könnten Sie http-proxy zu tun. Dies bedeutet, dass die server mit der HTTPS-Verbindung und leitet die Anfrage an den server B über HTTP. HTTP sendet dann die Antwort zurück zum server Ein, die update-die Antwort-Header zu machen es so Aussehen, kam die Antwort von server A selbst und leitet die Antwort an den Benutzer.
Würden Sie machen jede Ihrer apps auf server B zur Verfügung, das auf einer url auf die domain Ein, zum Beispiel https://www.domain-a.com/appOnB1 und https://www.domain-a.com/appOnB2. Der proxy würde dann leitet die Anfragen an den richtigen port auf server B.
Für Apache würde dies bedeuten, dass zwei zusätzliche Zeilen in Ihre Konfiguration pro app:
Wird die erste Linie stellen Sie sicher, dass der Apache leitet diese Anfrage an server B und der zweiten Linie stellen Sie sicher, dass Apache die Adresse ändert in der HTTP-Antwort-Header zu machen es so Aussehen, kam die Antwort von server A anstelle von server B.
Als Sie eine Anforderung haben, um diese proxy-dynamisch, macht es mehr Sinn diese proxy-up innen Ihre NodeJS-app auf dem server Ein, denn das app vermutlich bereits das wissen über die verschiedenen apps, die live auf dem server B. ich bin kein NodeJS-Experte, aber eine schnelle Suche zeigte https://github.com/nodejitsu/node-http-proxy die aussieht, als würde den trick tun und wirkt wie eine gut gepflegte Projekt.
Die Allgemeine Idee bleibt die gleiche, aber: Sie machen die apps, die Sie auf server B den Zugriff über server Einen proxy server mit Einer HTTPS-set-up. Für den Benutzer sieht es wie alle apps, die auf server B sind gehostet auf domain A.
Nachdem Sie diese einrichten, die Sie verwenden können
https://DOMAIN_NAME_OF_SERVER_A/fooApp
wie die url für den iFrame zu laden, die apps über HTTPS.Warnung: dies sollten Sie nur tun, wenn Sie können, und leiten Sie das traffic intern (server A und B sich gegenseitig erreichen können auf dem gleichen Netzwerk), sonst Datenverkehr abgefangen werden könnten, auf dem Weg von server A zu server B aus.
Es kam, um mein Gehirn, aber ich hatte es nicht klar genug, so dass noch noch nicht ausprobiert. Ich glaube ich muss die Anfrage zu machen, um so etwas wie:
https://DOMAIN_NAME_OF_SERVER_A/proxy?addr=NAME_OF_APP_ON_SERVER_B&port=PORT
zu ersetzen, die dem ursprünglichen http-Weise:http://IP_ADDR_OF_SERVER_B:PORT
Ist es wahr? Obwohl, dieses zu erreichen, bin ich immer noch nicht so klar, wie es zu implementieren? Muss ich hinzufügen, dass einige APIs, die in der node.js app auf dem Server Ein? Oder muss ich bei Verwendung des Nginx auf Server B?In meiner ursprünglichen Antwort, die Sie hinzufügen würde, eine location-block für jede app, die über die
location /
block. Ich fürchte, ein query-parameter nicht funktionieren würde, weil ich denke, dass nginx ignorieren wird es in der Lage zu blockieren. In dieser Lösung wird der Verkehr würde nicht sogar schlagen Ihre nodejs Anwendung, die es schwer machen, diese Dynamik. Eine weitere einfache Lösungen für Ihre situation sein könnte für die Verwendung eines http-proxy in deinem NodeJS-Anwendung. Eine Google-Suche kam mit github.com/nodejitsu/node-http-proxy als ein Paket, das geeignet sein könnte, aber ich bin nicht eine NodeJS-Experte.Ich habe bearbeitet Sie meine Antwort, damit es mehr allgemein über die Idee, einen proxy und enthalten die etwas über den NodeJS-Projekt.
Danke eawenden! Ich habe eine Allgemeine Verständnis. Noch eine kurze Frage: Da mein Server A und Server B kommunizieren miteinander im öffentlichen Verkehr, es scheint nicht möglich, hinzufügen einer reverse-proxy-Server Ein, nach Ihren Warning. Also muss ich eine andere domain und das Zertifikat für Server B, und tun proxy_pass auf Server B?
InformationsquelleAutor eawenden
Der beste Weg, es zu tun, wäre ein reverse-proxy ( Nginx unterstützt Sie ), der Zugriff auf den docker-Container:
- Quelle
Weisen einen domain-Namen oder die IP-Adresse des reverse proxy und erstellen einer vertrauenswürdigen Zertifikat (Let ' s Encrypt bietet Kostenlose Zertifikate). Dann können Sie die Verbindung zum reverse-proxy über HTTPS mit einem vertrauenswürdigen Zertifikat und es wird Griff, eine Verbindung mit dem richtigen Docker-container.
Hier ist ein Beispiel für diese Art der Einrichtung richtet sich speziell in Richtung Docker: https://github.com/jwilder/nginx-proxy
InformationsquelleAutor Alex W
Die Fehlermeldung ist ziemlich viel, sagen Ihnen die Lösung.
Wenn die Hauptseite geladen wird über eine HTTPS-Verbindung, dann werden alle anderen Inhalte auf der Seite, einschließlich des iframes, sollte auch geladen werden, die über HTTPS.
Der Grund ist, dass unsichere (nicht HTTPS) Datenverkehr kann bei der übertragung manipuliert wurde, möglicherweise verändert werden können, enthalten bösartigen code, der verändert die sichere Inhalte. (Betrachten Sie zum Beispiel eine login-Seite mit einem script eingespritzt wird, Stiehlt die Benutzer-id und Kennwort.)
== Aktualisiert, um die "ergänzenden Informationen" ==
Wie gesagt, alles auf die Seite geladen werden muss, per HTTPS. Ja, selbst-signierte Zertifikate funktionieren, aber mit einigen vorbehalten: Erstens müssen Sie dem browser mitteilen, um Ihnen zu erlauben, und zweitens, Sie sind wirklich nur geeignet für den Einsatz in einem Entwicklungs-situation. (Sie tun nicht möchten, um Benutzer in die Gewohnheit, indem Sie durch eine Sicherheits-Warnung.)
Die Antwort von @eawenden bietet eine Lösung für alle content zu kommen scheinen, von einem einzigen server aus, wodurch eine Möglichkeit zur Verwendung eines einzelnen Zertifikats. Seien Sie gewarnt, reverse-proxy ist ein etwas fortgeschrittenes Thema und es kann schwieriger sein, sich in einer Produktionsumgebung.
Alternative, wenn Sie den Server für alle die iframes werden kann, um die Verwendung eines wildcard SSL-Zertifikat. Dies würde ausgestellt werden, zum Beispiel für *.mydomain.com und funktionieren würde http://www.mydomain.com, subsite1.mydomain.com, subsite2.mydomain, etc, für alles, was unter mydomain.com
Vielen Dank für die weiteren Anweisungen. Es ist eine professionelle anwser die sicherlich führt zur richtigen Lösung. Ich denke, dass es noch ein wenig mehr spezifische und detaillierte Punkt für mich, um nachzudenken, kann über die ursprüngliche Frage. Wie das, was Sie erwähnt haben, über reverse-proxy.
Ja ein wildcard-Zertifikat wäre eine einfache Lösung, die gut funktionieren wird. Das einzige, was zu lösen ist, dass Sie können nicht hinzufügen von ports, um Ihre DNS-Konfiguration Punkt-zu-den docker-apps direkt, so würden Sie brauchen, um einen proxy auf server B direkt den eingehenden Datenverkehr an die richtige app. Sie könnten github.com/jwilder/nginx-proxy, um diese Einrichtung ziemlich einfach.
InformationsquelleAutor ThatBlairGuy