Problémy s autentifikací přes CURL digest v PHP 5.6.8

Zrovna jsem zjistil, že PHP ve verzi 5.6.8 pro Windows má problém se autorizovat na weby přes curl, které používají ověření pravosti přístupu digest. Přesněji po použití hlaviček generovaných Windows SSPI vráti autentifikační mechanismus za použití funkce CURL nesprávný obsah hlavičky, čímž znemožní přihlášení na daný server.

Zjednodušeně se autorizace digest provádí tak, že si nejprve ze severu vyžádáme hlavičku http code 401, jejíž obsahem jsou informace o druhu autorizace a také důležité hodnoty pro výpočet HASH hodnoty, která se pak zpět zasílá pro ověření správné autorizace. Jedním z těchto hodnot je hodnota REALM, která má být podle specifikace zaslána v druhém požadavku nezměněna, nicméně PHP tuto hodnotu zasílá v tom druhém požadavku prázdnou a vzdálený server tak nemůže autorizaci provést. Uvedu to na příkladu:

Hlavička prvního dotazu na server vypadá následovně:

HTTP/1.1 401 Unauthorized
Content-Length: 0
Server: Microsoft-IIS/8.5
WWW-Authenticate: Digest qop="auth",algorithm=MD5-sess,nonce="afdasd",charset=utf-8,realm="Digest"
X-Powered-By: ARR/2.5
Date: Thu, 25 Feb 2016 09:25:55 GMT

 

PHP v tomto případě nastaví a vypočítá příslušné hodnoty a odešle hlavičku:

GET /Feed/feedcz.xml HTTP/1.1
Authorization: Digest username="...",realm="",nonce="afdasd",uri="some.xml",cnonce="565sdf",
nc=00000001,algorithm=MD5-sess,response="25651sadf",qop="auth", ....
Host: somehost.sk
Accept: */*

Všimněte si, že hodnota realm je v tomto případě prázdná – a to je ta chyba, která zapřičiní chybnou autorizaci.

Není to ani tak chyba PHP, ale přímo modulu CURL, který tuto chybu opravuje v pozdějších verzích. Je možné, že PHP ve verzi vyšší než 5.6.8 již tímto neduchem netrpí, ale nevím. Co jsem zkoušel tak verzi PHP 5.4.36 na linuxu – tam to funguje, a poté na Windowsech až verzi PHP 7 a tam to již také funguje správně.