Henryk Plötz: HTTP Digest Access Authentication mit Microsoft-Software kaputt?

Moin,

* Erstmal eine längere Einleitung:
Ich habe grade angefangen mich mit Digest Access Authentification nach RFC 2617 anzufreunden da man damit einige schöne Sachen machen kann und habe etwas herumgespielt. Unter anderem habe ich auch den Microsoft Internet Explorer benutzt, um mich an einem Apache mit mod_auth_digest anzumelden und die Ausgabe von phpinfo() zu betrachten. Dabei fiel mir auf, dass ja alle Bilder fehlen. Also flugs ethereal rausgeholt und mal ein bisschen auf die Leitung gesehen:

Die erste Anfrage nach phpinfo.php wird ordnungsgemäß abgelehnt und mit einem 401-Status sowie einem WWW-Authenticate-Header beantwortet. Der IE zeigt dann ein Eingabefeld an und weist sogar vorbildlicherweise darauf hin, dass das Passwort bei dieser Verbindung sicher sei (das macht Mozilla zum Beispiel nicht). Dann sendet er eine erneute Anfrage und gibt einen korrekten Authorization-Header an, woraufhin die phpinfo()-Ausgabe auch korrekt an ihn geliefert wird. Jetzt versucht er die Bilder zu laden und da passiert's:

| GET /~henryk/phpinfo.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1
[snip]
| Authorization: Digest username="fubar", realm="Privatbereich", qop="auth",
|                algorithm="MD5", uri="/~henryk/phpinfo.php",
|                nonce="YJWCPg==bf557d85807dfb25d326d4fb10449e8a3246e596",
|                nc=00000002, cnonce="725ac3c586e7ed23f3e5b47feb2a3bb9",
|                response="a84aaee25988c64e9616918f3949748b"

Vielleicht dazu noch ein kleiner Ausschnitt aus RFC 2617 mit der Erklärung zum Inhalt der uri-Angabe im Authorization:-Header:
| The URI from Request-URI of the Request-Line; duplicated here
| because proxies are allowed to change the Request-Line in transit.

Na, wer errät was das Server da korrekterweise antwortet?
Genau!

| HTTP/1.1 400 Bad Request
| Date: Thu, 27 Mar 2003 06:08:47 GMT
| Server: Apache/1.3.27 (Unix)  (Gentoo/Linux) PHP/4.3.1 mod_ssl/2.8.14
|         OpenSSL/0.9.6i
| Connection: close
| Content-Type: text/html; charset=iso-8859-1
|
| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
| <HTML><HEAD>
| <TITLE>400 Bad Request</TITLE>
| </HEAD><BODY>
| <H1>Bad Request</H1>
| Your browser sent a request that this server could not understand.<P>
| Digest: uri mismatch - </~henryk/phpinfo.php> does not match request-uri
| </~henryk/phpinfo.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42><P>
| <HR>
| <ADDRESS>Apache/1.3.27 Server at gleam.homeip.net Port 80</ADDRESS>
| </BODY></HTML>

Weitere Tests haben ergeben, dass unser aller Lieblingsbrowser aus Redmond bei allen Versuchen den Teil hinter dem Fragezeichen 'vergisst', wenn es darum geht die Antwort auf die Challenge zu berechnen.

* Und nun zu meinem Anliegen:
Bin ich blöd und habe irgendetwas überlesen das es dem IE erlaubt so einen Unsinn zu verzapfen? Oder ist er tatsächlich kaputt? Und wenn ja, warum hat das noch niemand gemerkt und korrigiert? (Ich habe mir mittlerweile bestätigen lassen, dass auch ein aktueller IE 6 dieses Verhalten zeigt.) Lässt das vielleicht sogar einen Rückschluß auf die tatsächliche Verbreitung von Digest Access Authentication zu? ;-)

Angeblich verwendet ja sogar Microsoft bei mindestens einem seiner Dienste Digest Access Authentication. Da ich denen durchaus zutraue, ihre Sachen hin und wieder mal zu testen und dazu sogar ihren eigenen Browser zu benutzen, stellt sich die Frage warum es ihnen dabei nicht aufgefallen ist noch mehr. Es sei denn: Ist der Internet Information Server etwa genauso kaputt? Mein Versuch so einen zu installieren, um das zu testen scheiterte leider daran, dass der IIS eine Domain mit Active Directory vorraussetzt, um Digest Access Authentication aktivieren zu können.
Hat vielleicht jemand von euch so etwas laufen und könnte das mal ausprobieren?

Zwischenfazit: Man kann Digest Access Authentication noch nicht wirklich verwenden, es sei denn man kann den IE oder URLs mit Query-Part ausschließen - ganz im Gegensatz zu einer anderslautenden Aussage in http://forum.de.selfhtml.org/archiv/2001/6/26072/#m136055.
Zumal mir bisher noch keine lebende Implementierung von qop=auth-int über den Weg gelaufen ist, welches ja einen der wirklich interessanten Teile von RFC 2617 darstellt.

--
Henryk Plötz
Grüße aus Berlin
  1. Ich habe grade angefangen mich mit Digest Access Authentification nach RFC 2617 anzufreunden da man damit einige schöne Sachen machen kann und habe etwas herumgespielt. Unter anderem habe ich auch den Microsoft Internet Explorer benutzt, um mich an einem Apache mit mod_auth_digest anzumelden und die Ausgabe von phpinfo() zu betrachten.

    Was sagt dein IE denn zu guest/guest bei http://jigsaw.w3.org/HTTP/Digest/?

    Alle Versionen die ich je getestet habe versagen, sie greifen zweimal mit demselben Request drauf zu und melden dann einen DNS-Fehler...

    1. Moin,

      Alle Versionen die ich je getestet habe versagen, sie greifen zweimal mit demselben Request drauf zu und melden dann einen DNS-Fehler...

      Hier genau das selbe. Zwei Zugriffe ohne Authentifizierungsversuch. Das ist sogar in sofern besonders peinlich als die Seite nur Digest Access Authentication nach RFC 2069 macht, und der ist immerhin von Januar 1997.

      Hmm, ein bisschen weiter getestet. Genau das scheint das Problem zu sein: Sobald der Server aufhört eine qop-Angabe zu senden (RFC 2617 macht das aus Kompatibilität zu RFC 2069 ausdrücklich optional), hört der Internet Explorer auf, eine Authentifizierung zu versuchen.

      Blödes Mistding, kaputtes!

      PS: Danke übrigens für den URL. Meine eigene Implementierung in PHP konnte nämlich auch nicht darauf zugreifen, da ich noch einen Bug in einem Regex hatte (ein + statt einem *). Den konnte ich jetzt fixen.

      --
      Henryk Plötz
      Grüße aus Berlin