Martin: PHP bei Proxyserver

Proxyserverumleitung

Hallo Leute,

ich habe möchte bei 1und1 einen SSL-geschützten Bereich zur Verfügung stellen. 1und1 gibt hierzu folgende Anleitung:

-----------------------------------
Ihre Präsenz ist erreichbar unter dem Domainnamen www.<>.de. Als Subdomain haben Sie z.B. die Domain www.bestellung.<>.de vorgesehen. Um die Übertragung der Daten Ihrer Kunden zu verschlüsseln, können Sie hier die Subdomain www.bestellung.<>.de festlegen. Danach brauchen Sie nur noch den unten angegeben Link in den Sourcecode beim Start Ihrer Bestellung einzufügen.
D.h. anstatt www.bestellung.<>.de geben Sie als Ziel der verschlüsselten Datenübertragung https://ssl.kundenserver.de/bestellung.<>.de an.
Bitte beachten Sie, dass unter 'Domainverwaltung' für diese Domain keine Umleitung aktiviert sein darf. Eine Umleitung der verschlüsselten Übertragung auf externen Webspace ist nicht möglich.

Die Einstellungen habe ich getroffen:

SSL-Proxy-Einstellungen
https://ssl.kundenserver.de/intern.xxx-xxx.de
-----------------------------------

Ich habe einen Link auf meine Subdomain mit dem Loginscript gelegt:

<p><a href="https://ssl.kundenserver.de/intern.xxx-xxx.de">Test mit ssl</a></p>

Dann erscheint auch wie erwartet der Sicherheitshinweis und ich gelange im Browser auf die Seite:

https://ssl.kundenserver.de/intern.xxx-xxx.de/

In dem Verzeichnis stehen 3 Dateien. index.php, login.php, login_check.php welche gegenseitig aufeinander zugreifen:

include("login.php");
require("login_check.php");

Worauf mein Browser auf folgende Adresse geht:

https://ssl.kundenserver.de/index.php3/

welche mit der Fehlermeldung:

Fehler: kein SSL-Proxy aktiviert! Für die angeforderte Domain ist kein SSL-Proxy konfiguriert. Falls Sie der Eigentümer der Domain sind, können Sie dies in Ihrem Konfigurationsmenü ändern.

quittiert wird.

Logisch, hier müsste

https://ssl.kundenserver.de/intern.xxx-xxx.de/index.php3/

stehen.

Jetzt meine Frage: Wie schaffe ich es, das dies klappt.

Ich habe in dem Loginskript die Zeilen:

include("login.php3"); und require("login_check.php3");  welche mir die Probleme verursachen. Ich habe es schon mit

include("https://ssl.kundenserver.de/intern.xxx-xxx.de/login.php3");

und

include("www.intern.xxx-xxx.de/intern.xxx-xxx.de/login.php3");

versucht. Funktioniert aber nicht.

Kann mir jemand weiterhelfen?

Martin

  1. 1und1 braucht gelegentlich ein wenig um das alles auch zu schalten. Es _kann_ daran liegen.

    Im Skript habe ich nichts fehlerhaftes gefunden. Im Zweifelsfall frag den Kundenservice per e_Mail oder Telefon (Mit dem Vertrag müsstest Du eine 800er Nummer haben).

    Bis jetzt hat mich der Service von 1und1/puretec/kundenserver/schlund eigentlich noch nie mit Sorgen alleingelassen... und die kennen ihre Konfiguration sehr gut und antworten sehr verständlich.

    fastix

    1. Ich hab grad was gefunden:

      http://www.pcwelt.de/tipps/online/browser/29392/

      Internet Explorer 6: Probleme mit sicheren Seiten

      Problem:

      Nach der Installation des Service Packs 1 für den Internet Explorer 6 haben Sie keinen Zugriff mehr auf sichere Seiten. Sie haben die "Internetoptionen" mit denen eines PCs verglichen, auf dem der IE 6 noch ohne SP1 läuft, aber keine Unterschiede festgestellt.

      Liegts vielleicht da dran?

      fastix

      1. Vielen Dank,

        muß es heute einmal versuchen.

        Martin

  2. Moin!

    Ich habe einen Link auf meine Subdomain mit dem Loginscript gelegt:

    <p><a href="https://ssl.kundenserver.de/intern.xxx-xxx.de">Test mit ssl</a></p>

    Dann erscheint auch wie erwartet der Sicherheitshinweis und ich gelange im Browser auf die Seite:

    https://ssl.kundenserver.de/intern.xxx-xxx.de/

    In dem Verzeichnis stehen 3 Dateien. index.php, login.php, login_check.php welche gegenseitig aufeinander zugreifen:

    include("login.php");
    require("login_check.php");

    Worauf mein Browser auf folgende Adresse geht:

    https://ssl.kundenserver.de/index.php3/

    welche mit der Fehlermeldung:

    Fehler: kein SSL-Proxy aktiviert! Für die angeforderte Domain ist kein SSL-Proxy konfiguriert. Falls Sie der Eigentümer der Domain sind, können Sie dies in Ihrem Konfigurationsmenü ändern.

    Ursache der Fehlermeldung dürfte die falsche URL sein. Ich behaupte, dass dieser Fehler wohl eher von einem fehlerhaften Link verursacht wird, als von irgendwas, was in PHP programmiert ist (wenn PHP allerdings den fehlerhaften Link ausspuckt, hast du natürlich trotzdem verloren).

    Als Hauptursache scheint mir möglich, dass du einen absoluten Link mit "/index.php3" angegeben hast. Das funktioniert ohne den SSL-Krams auf deiner http://intern.xxx-xxx.de wunderbar (denn da ruft der Link auf "/index.php3" immer die URL "http://intern.xxx-xxx.de/intern.php3" auf), aber sobald der SSL-Kram hinzukommt (aufgrund der Fehlermeldung vermute ich, dass 1&1 da einfach einen Proxy hingestellt hat, der im Prinzip alle Seiten per SSL abrufen kann - welche Domain er dafür nimmt, steht im ersten Verzeichnisnamen), führt ein Link "/index.php3" auf der Seite "https://ssl.kundenserver.de/intern.xxx-xxx.de/irgendwas.html" natürlich nicht zu "https://ssl.kundenserver.de/intern.xxx-xxx.de/index.php3", sondern zu "https://ssl.kundenserver.de/index.php3". Und weil der Proxy das erste Verzeichnis als Domainnamen interpretieren will, erfolgt erstmal ein Redirect auf "https://ssl.kundenserver.de/index.php3/" (man beachte den abschließenden Schrägstrich), und weil es keine Domain "http://index.php3" im Internet gibt (und erst recht nicht bei 1&1), erfolgt dann die Fehlermeldung.

    Jetzt meine Frage: Wie schaffe ich es, das dies klappt.

    Ich habe in dem Loginskript die Zeilen:

    include("login.php3"); und require("login_check.php3");  welche mir die Probleme verursachen. Ich habe es schon mit

    include("https://ssl.kundenserver.de/intern.xxx-xxx.de/login.php3");

    und

    include("www.intern.xxx-xxx.de/intern.xxx-xxx.de/login.php3");

    versucht. Funktioniert aber nicht.

    Logischerweise funktioniert das eher nicht. PHP kennt SSL-Verschlüsselung erst seit Version 4.3.0 wirklich richtig, vorher kann man über die URL-fopen-wrappers nur HTTP-Zugriffe machen.

    Aber du willst auch gar nicht per HTTP includen. Die include()- und require()-Anweisung ist prima, so wie sie war. Der Fehler liegt, wie erwähnt, in der Verlinkung.

    Wenn du die index.php3 mal direkt aufrufst, sollte die Seite eigentlich direkt angezeigt werden - es sei denn, du machst irgendwelche Redirects auf die falsche URL, oder gibst falsche Links aus. Dann kann es natürlich nicht funktionieren.

    Die Links müssen entweder alle relativ sein (dürfen also nicht mit "/" beginnen)  oder server-absolut mit "https...(kompletter URL-Pfad hier rein)".

    - Sven Rautenberg

    --
    "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
    1. Danke,

      das Problem hat irgendwas mit dem Aufruf "$PHP_SELF" zu tun, aber was, weiß ich noch nicht so richtig. Ich bin auf der Suche.

      Martin

      1. Moin!

        Danke,

        das Problem hat irgendwas mit dem Aufruf "$PHP_SELF" zu tun, aber was, weiß ich noch nicht so richtig. Ich bin auf der Suche.

        Aha. In $PHP_SELF steht der eigene Skriptname drin.

        Da ich aber vermute, dass 1&1 eben einen SSL-Proxy einsetzt, ist diese Angabe im SSL-Kontext falsch.

        Der Proxy arbeitet so: Du hast eine Subdomain definiert. Darin befinden sich Seiten. Diese Domain ist per http zugänglich.

        Der Besucher ruft diese Seiten aber über den SSL-Proxy ab. Das bedeutet, dass die eigentliche URL (via http) nicht identisch ist mit der Proxy-URL (via https), weil eben dieses Verzeichnis da mit reinkommt. Das bedeutet auch, dass dein Skript absolut nicht wissen kann (vielleicht mit Ausnahme der Tatsache, dass der SSL-Proxy sich irgendwie zu erkennen gibt), dass es über SSL ausgeliefert wird. Es reagiert immer so, als sei es mit HTTP direkt angesprochen worden.

        Wenn also z.B. ein Formular an sich selbst geschickt werden soll, wird üblicherweise <form action="<?=$PHP_SELF?>"> verwendet, damit man den echten Skriptnamen nicht hardcoden muß.

        In $PHP_SELF steht aber die Domain und der absolute Servername nicht drin, sondern nur der absolute Pfad. Vergleiche mal mit der Ausgabe von phpinfo(INFO_VARIABLES). Also wird das Formular immer an "/absoluterpfad/skript.php" gesenden. Wenn der Browser es von deiner http-Domain erhalten hat, ist das gut. Wenn er es von der SSL-Domain erhalten hat, ist das falsch!

        Wie ich schon im ersten Posting vermutete: Es ist eine Pfad-Frage.

        Zwei Tipps:

        1. Verwende besser _nicht_ $PHP_SELF, sondern die Variante $_SERVER['PHP_SELF']. Es ist damit zu rechnen, dass auch 1&1 irgendwann register_globals auf off schaltet, und dann würde dein Skript nicht mehr funktionieren. Solltest du das Skript auf einen Server packen wollen, auf dem das schon so ist, hast du in jedem Fall verloren.

        2. Die Informationen, die in $_SERVER drinstehen, dürften für dich der Schlüssel zum Erfolg sein. Du mußt dort entweder eine Angabe finden, die die originale URL enthält (in der also https....etc drinsteht), oder du mußt eine Angabe finden, die besagt, dass der SSL-Proxy den Request gesendet hat. Im ersten Fall verwendest du diese Angabe anstatt $PHP_SELF, im zweiten Fall kannst du $PHP_SELF durch einen passenden String ergänzen, damit die Angabe wieder stimmt. Beispiel:
        Wenn der Request normal reinkommt (HTTP), dann nimm $PHP_SELF. Kommt er vom Proxy, nimm "/intern.xxx-xxx.de".$PHP_SELF als Ziel.

        - Sven Rautenberg

        --
        "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)