Andreas: Problem bei Kombination SSL + .htaccess

Hallo!

Ich habe folgendes Problem:
Ich habe ein Unterverzeichnis der Webseite mit .htaccess Passwortgeschützt. Zusätzlich will ich jetzt noch eine SSL Verschlüsselung benutzen. Das geht ja im Prinzip mit https statt http, nur soll das nicht jedesmal eingegeben werden, sondern automatisch überprüft werden, das mache ich wie folgt:

$adresse = parse_url(getenv("SCRIPT_URI"));
if ($adresse['scheme'] != "https"){
    header ("Location: https://".$adresse['host']."/".$adresse['path']);
    exit;
}

Problem, der htaccess-Schutz greift ja vorher, also muß man erst die Benutzerdaten eingeben, diese werden im Klartext gesendet, dann kommt erst das Zertifikat, und im IE muß man sich danach nochmals anmelden. Das ist so nicht wirklich optimal. Hat jemand einen Tip wie man sowas besser macht, also _erst_ die Verschlüsselung und _dann_ die Anmeldung?
Es soll jedenfalls so funktionieren, das man im Browser "domain.de/verzeichnis" eingibt, dann erst auf "https://domain.de/verzeichnis" weitergeleitet wird und dann der htaccess-Schutz greift, also die Anmeldung erfolgt.

Viele Grüße
Andreas

  1. Hi,

    Problem, der htaccess-Schutz greift ja vorher, also muß man erst die Benutzerdaten eingeben, diese werden im Klartext gesendet, dann kommt erst das Zertifikat, und im IE muß man sich danach nochmals anmelden.

    ja, selbstverständlich. Du leitest auf einen anderen Server um, für den die vorherige Authentifizierung nicht gilt. Dass es sich faktisch um den gleichen Server handelt, weiß außer Dir niemand - nicht mal der Server selbst, und am wenigsten der Client.

    Hat jemand einen Tip wie man sowas besser macht, also _erst_ die Verschlüsselung und _dann_ die Anmeldung?

    Klar: Keine Authentifizierung unter HTTP verlangen. Wie Du das machst, bleibt Dir mit der Dokumentation (http://httpd.apache.org/) unterm Kopfkissen vorerst selbst überlassen ;-) Solange Du bei HTTP _und_ HTTPS den Passwortschutz offen hälst, wird sich der Client zwei Mal anmelden müssen.

    Naja, Du kannst natürlich auch einen Browser programmieren, der sich anders verhält, und diesen hinreichend verbreiten... :-)

    Cheatah

    1. Hallo!

      Hat jemand einen Tip wie man sowas besser macht, also _erst_ die Verschlüsselung und _dann_ die Anmeldung?

      Klar: Keine Authentifizierung unter HTTP verlangen. Wie Du das machst, bleibt Dir mit der Dokumentation (http://httpd.apache.org/) unterm Kopfkissen vorerst selbst überlassen ;-) Solange Du bei HTTP _und_ HTTPS den Passwortschutz offen hälst, wird sich der Client zwei Mal anmelden müssen.

      Du weißt das ich davon keine Ahnung habe. Ich will ja gar nichts mit http offenhalten, ich will lediglich das man nicht https:// immer eingeben muß.
      Ich will aber trotzdem sicherstellen, das die Anmeldung erst im https Bereich geschieht. Ist das überhaupt möglich wenn ich das PHP-Script in dem htaccess-geschützen Verzeichnis habe? Wahrscheinlich nichtm, aber was ahbe ich für ernsthafte Alternativen? Könnte ich diese Weiterleitung nicht irgendwie von dem php-Script in die htacesss verlagern, so das deise schon vor der Authentifiziereung passiert?

      Naja, Du kannst natürlich auch einen Browser programmieren, der sich anders verhält, und diesen hinreichend verbreiten... :-)

      OK, aber wie stelle ich sicher das der dann auch so wie der IE verbreitet ist?

      Grüße
      Andreas

      1. Hi Andreas,

        Ich will ja gar nichts mit http offenhalten, ich will lediglich das
        man nicht https:// immer eingeben muß.

        wer muß warum wo was eingeben?

        Also in dem WWW, das ich so kenne, klickt man im Wesentlichen auf
        irgendwelche Links - und Du kannst sehr wohl in einer via HTTP
        ausgelieferten Seite einen Link auf eine via HTTPS ausgelieferte
        Seite haben. Erst _hinter_ diesem Link darf dann allerdings der
        passwortgeschützte Bereich liegen - nicht schon vorher. Also _nur_
        innerhalb des HTTPS-Servers.

        Ich will aber trotzdem sicherstellen, das die Anmeldung erst im
        https Bereich geschieht.

        Es gibt keinen "HTTPS-Bereich". Das ist ein anderer Server - mit
        allen Nachteilen, die Du gerade erlebst.

        Ist das überhaupt möglich wenn ich das PHP-Script in dem htaccess-
        geschützen Verzeichnis habe?

        Diese Frage habe ich nicht verstanden.

        Könnte ich diese Weiterleitung nicht irgendwie von dem php-Script
        in die htacesss verlagern, so das deise schon vor der
        Authentifiziereung passiert?

        Die Authentifizierung wird durch das Ansprechen eines URL aus einem
        geschützten Bereich ausgelöst. Das hat nichts damit zu tun, _wie_
        dieses Ansprechen geschicht (auch eine Weiterleitung auf einen URL
        spricht diesen an).

        Naja, Du kannst natürlich auch einen Browser programmieren, der
        sich anders verhält, und diesen hinreichend verbreiten... :-)
        OK, aber wie stelle ich sicher das der dann auch so wie der IE
        verbreitet ist?

        Der Smiley am Ende dieser Aussage Cheatahs hatte durchaus einen Sinn.

        Viele Grüße
              Michael

        1. Hallo Michael!

          Ich glaube Du hast mir noch nie vor 2 Uhr Nachts geantwortet ;-)

          Ich will ja gar nichts mit http offenhalten, ich will lediglich das
          man nicht https:// immer eingeben muß.

          wer muß warum wo was eingeben?

          Es geht um einen internen Bereich einer Webseite, der nur Mitarbeitern zugänglich sein soll. Ich habe jetzt kein Intranet zur Verfügung aus dem ich einen Link setzen könnte, vieleicht von der Homepage selbst, aber es soll so funktionieren, das der Mitarbeiter in seinen Browser "www.doamin.de/verzeichnis" eingibt, dann auf "https://www.doamin.de/verzeichnis" umgeleitet wird und sich erst danach das Login-Fenster von htaccess öffnet.

          Also in dem WWW, das ich so kenne, klickt man im Wesentlichen auf
          irgendwelche Links - und Du kannst sehr wohl in einer via HTTP
          ausgelieferten Seite einen Link auf eine via HTTPS ausgelieferte
          Seite haben. Erst _hinter_ diesem Link darf dann allerdings der
          passwortgeschützte Bereich liegen - nicht schon vorher. Also _nur_
          innerhalb des HTTPS-Servers.

          Also der Server ist derselbe, ich kann die selben Inhalte über http://domain.de/seite.htm ansprechen, wie über https://domain.de/seite.htm. htaccess-geschützt ist nur ein Unterverzeichnis für den Internen Bereich.

          Ich will aber trotzdem sicherstellen, das die Anmeldung erst im
          https Bereich geschieht.

          Es gibt keinen "HTTPS-Bereich". Das ist ein anderer Server - mit
          allen Nachteilen, die Du gerade erlebst.

          Ja gut, ich habe eine headerweiterleitung(per php) aus dem geschützen Verzeichnis auf den https Server, falls die Verbindung nicht bereits über https läuft. Nur leider muß man sich einmal vor dem Start des php-Scriptes einloggen, und bei Weiterleitung auf das im Prinzip selbe Verzeichnis nochmals.

          Ist das überhaupt möglich wenn ich das PHP-Script in dem htaccess-
          geschützen Verzeichnis habe?

          Diese Frage habe ich nicht verstanden.

          Wie oben beschrieben sehe ich das Problem an der Stelle, das das PHP-Script, welches in dem Fall das man nicht schon über den https-Server "unterwegs ist", erst nach erfolgreichem Login aufgerufen werden kann, da das Verzeichnis in dem dieses PHP-Script liegt und von dem Benutzer per "www.domain.de/verzeichnis" aufgerufen wurde, per htaccess geschützt ist, und wenn man also nicht bereits über https verbunden ist, wird man nochmal auf dasselbe Verzeichnis, nur mit https, statt http weitergeleitet, und die htaccess-Eingabe muß erneut erfolgen.

          Könnte ich diese Weiterleitung nicht irgendwie von dem php-Script
          in die htacesss verlagern, so das deise schon vor der
          Authentifiziereung passiert?

          Die Authentifizierung wird durch das Ansprechen eines URL aus einem
          geschützten Bereich ausgelöst. Das hat nichts damit zu tun, _wie_
          dieses Ansprechen geschicht (auch eine Weiterleitung auf einen URL
          spricht diesen an).

          Genau das ist das Problem. Ich möchte ja lediglich irgendwie Anfragen an den http Server zunächst an den https weiterleiten, und erst danach soll die Eingabe der Benutzerdaten erfolgen. Ginge das mit der htaccess? Wenn ja wie?

          Der Smiley am Ende dieser Aussage Cheatahs hatte durchaus einen Sinn.

          Das war mir auch klar ;-)

          Viele Grüße
          Andreas

          1. Genau das ist das Problem. Ich möchte ja lediglich irgendwie Anfragen an den http Server zunächst an den https weiterleiten, und erst danach soll die Eingabe der Benutzerdaten erfolgen. Ginge das mit der htaccess? Wenn ja wie?

            Ich habe mich zugegebenermaßen gerade die erste Stunde mit dem SSL-Kram beschäftigt, aber soweit ich das bis hier überblicke (man möge mich berichtigen), wäre die einfachste Option, daß Du die .htaccess-Authenifizierung rausschmeißt und sie stattdessen in Dein(e) PHP-Skript(e) übernimmst.
            Du kannst im PHP-Skript abfragen, ob SSL für die Verbindung aktiv ist. Falls ja, machst Du die Authentifizierung, falls nicht, sendest Du eine Weiterleitung and die https:-Adresse.
            Nachteil: Alles, was im Verzeichnis nicht von PHP verarbeitet wird (Grafiken zum Beispiel, aber auch .html-Sachen), lässt sich auch ohne SSL _und_ vor allen Dingen ohne Authentifizierung abrufen.

            Zweite Möglichkeit: SSLRequireSSL in die .htaccess. Damit kann dieses Verzeichnis nur noch per SSL abgerufen werden. Das müsste rein theoretisch noch vor der Authentifizierung greifen, allerdings gibt es hier keine automatische Weiterleitung - womit sich aber immerhin die Lernkurve der Anwender deutlichst erhöht; wer ständig Fehlermeldungen erhält, lernt schneller, https: einzutippen statt http:.

            Dritte Möglichkeit:
            Zwei Webserver, einer mit SSL, einer ohne. Das zu sichernde Verzeichnis liegt nur auf dem SSL-Server, der andere hat dort keine Dateien sondern nur eine Weiterleitung zum SSL-Server.

            Über <virtualhost>-Einträge kann man diese Geschichte anscheinend nur lösen, wenn die jeweilige Domain eine echte eigene IP-Adresse hat. Dann wären die Einträge wohl:

            <virtualhost servername:80>
              Redirect permanent / https://servername/
              ..
              </virtualhost>

            und

            <virtualhost servername:443>
              SSLRequireSSL
              [und die Authentifizierungsgeschichte..]
              ..
              </virtualhost>

            So, hoffentlich war das nicht allzu viel Unfug :) Ich bitte um hilfreiche Kommentare.

            Gruß,
              soenk.e

            1. Hallo!

              So weitreichenden Einfluß auf die Konfiguration des Apache habe ich dann doch nicht.
              Ich hatte noch folgende Idee für die .htaccess:

              RewriteEngine On
              RewriteBase /

              RewriteCond %{SERVER_PORT} !^443$
              RewriteRule /* https://www.server.com%{REQUEST_URI} [R=301,L]

              AuthType Basic
              <Limit GET>
              require valid-user
              </Limit>

              Naja, aber leider passiert hier genau dasselbe wie bei der Weiterleitung durch das PHP-Script innerhalb geschützten Bereich, die Athentifiziereung kommt zuvor.

              Kann man das nicht irgendwie so schreiben, das Auth... nur im Falle das Port = 443 verlangt wird? Dann muß nur sicher gestellt sein das Umgeleitet wird. So eine Art If-Abfrage wäre nicht schlecht, aber geht wahrscheinlich nicht in .htaccess, oder?

              Was könnte man da machen?

              Grüße
              Andreas

              1. Hi,

                So weitreichenden Einfluß auf die Konfiguration des Apache habe ich
                dann doch nicht.

                aha - das klärt einiges.

                Ich hatte noch folgende Idee für die .htaccess:
                RewriteEngine On
                RewriteBase /
                RewriteCond %{SERVER_PORT} !^443$
                RewriteRule /* https://www.server.com%{REQUEST_URI} [R=301,L]
                AuthType Basic
                <Limit GET>
                require valid-user
                </Limit>

                So ähnlich würde ich das auch machen, wenn ich die PHP-Weiterleitung
                eliminieren wollte.

                Naja, aber leider passiert hier genau dasselbe wie bei der
                Weiterleitung durch das PHP-Script innerhalb geschützten Bereich,
                die Authentifiziereung kommt zuvor.

                Eben. Für das, was Du willst, mußt Du in die httpd.conf hinein und
                dort das Verzeichnis server-spezifisch mappen.

                So eine Art If-Abfrage wäre nicht schlecht, aber geht wahrscheinlich
                nicht in .htaccess, oder?

                Apache-Konfiguration ist keine Programmiersprache.
                Die Unterscheidungsmöglichkeit hättest Du vielleicht via SetEnvIf ...
                aber mir fällt keine Direktive ein, die Du dann sinnvoll bedingt
                einsetzen könntest.

                Hättest Du Zugang zur httpd.conf, dann wäre alles ganz einfach.
                Wie wäre es also mit einem anderen Provider?

                Viele Grüße
                      Michael

          2. Hi Andreas,

            Ich glaube Du hast mir noch nie vor 2 Uhr Nachts
            geantwortet ;-)

            Traditionen sind dazu da, sie zu brechen. ;-)

            es soll so funktionieren, das der Mitarbeiter in
            seinen Browser "www.doamin.de/verzeichnis" eingibt,
            dann auf "https://www.doamin.de/verzeichnis"
            umgeleitet wird und sich erst danach das Login-
            Fenster von htaccess öffnet.

            Das geht - wenn Du nicht verlangst, daß beides auf
            dasselbe Verzeichnis auf der Festplatte zeigt.
            Du hast eine Menge Konfigurationsmöglichkeiten,
            dies zu ändern (Alias etc.).

            Also der Server ist derselbe, ich kann die selben
            Inhalte über http://domain.de/seite.htm ansprechen,
            wie über https://domain.de/seite.htm. htaccess-
            geschützt ist nur ein Unterverzeichnis für den
            Internen Bereich.

            "Der Server" ist für den Client nicht derselbe.
            Daß die Daten bei Dir auf derselben Maschine liegen und
            sogar im selben Verzeichnis, kann und darf der Client
            nicht wissen.

            Übrigens: Wieso ist dieses Verzeichnis denn für
            HTTP und HTTPS gleich gemappen, wenn es ohnehin nur
            via HTTPS ansprechbar sein soll? Blende via "Alias"
            in der HTTPS-Version das Verzeichnis ein, während Du
            in der HTTP-Version eine mod_rewrite-Regel schreibst,
            welche die Weiterleitung macht. (Dann brauchst Du
            nicht mal PHP dafür - und das Verzeichnis existiert
            jetzt nur noch in der HTTPS-Welt, kann also in der
            HTTP-Welt keine Interpretation der .htaccess-Datei
            mehr auslösen.)

            Nur leider muß man sich einmal vor dem Start des
            php-Scriptes einloggen, und bei Weiterleitung auf
            das im Prinzip selbe Verzeichnis nochmals.

            Nochmal: Entferne den Verzeichnis-URL aus dem HTTP-
            Server, belasse ihn aber im URL-Raum des HTTPS-Servers.

            Ist das überhaupt möglich wenn ich das PHP-
            Script in dem htaccess-geschützen Verzeichnis
            habe?

            Nicht, wenn beide auf dasselbe Verzeichnis zeigen.
            In Deinem Szenario würde ich übrigens vollständig
            auf .htaccess verzichten und die entsprechenden Direk-
            tiven in Deine httpd.conf schreiben, und zwar direkt
            an der Stelle, wo Du via Alias-Direktive das Verzeich-
            nis in den HTTPS-VirtualHost einblendest.

            Genau das ist das Problem. Ich möchte ja lediglich
            irgendwie Anfragen an den http Server zunächst an
            den https weiterleiten, und erst danach soll die
            Eingabe der Benutzerdaten erfolgen.

            Dann verhindere, daß die .htaccess im HTTP-Universum
            verwendet wird. Du hast viele verschiedene Möglich-
            keiten dafür ... die abstruseste wäre, den Namen dieser
            Datei im Apache umzudefinieren. ;-)

            Die sinnvollste wäre, das Verzeichnis, das im HTTP-
            Universum eh nicht angesprochen werden darf, dort auch
            gar nicht existieren zu lassen.

            Viele Grüße
                  Michael

            1. Hi!

              Ja, Du hast wohl Recht, ich mache einfacgh 2 Verzeichnisse, das wird das einfachste sein. So ohne weiteres geht das ja leider nicht wie ich mkr das vorgestellt hatte, udn nur wegen einem Verzeichnisnamen der eh egal ist da dahin weitergheleitet wird so einen Aufstand zu machen ist ziemlich lächerlich ;-)

              Grüße
              Andreas