DDEF13C063AE4E609E386546D085CA62
  • Holm Gehre
  • 07.10.2019
  • DE

Update:Delivery Server und NTLM / SSO ("trusted login")

Manche IT-Themen scheinen "zeitlos" zu sein und so ist es wenig verwunderlich, dass (m)ein Beitrag aus dem Jahr 2017 oft bzw. im Ranking der Ergebnis-/Trefferlisten von Suchanfragen ("NTLM" und "SSO") gelistet wird.

Vor kurzem wurde ich im Slack angeschrieben, dass der im Artikel Delivery Server und NTLM / SSO ("trusted login") beschriebene Weg nicht in jedem Fall zu funktionieren scheint.

Das Fehlerbild: Mit einigen Clients, vorrangig Windows 7, gab es keine Probleme. Mit anderen, vorrangig Windows 10 - jedoch nicht alle -  hingegen schon. Bei diesen Varianten wurde die Client NTLM-Nachricht nicht an den Delivery Server übermittelt.

Nach einiger Zeit der Recherche konnte zunächst eine progammatische Lösung für das offensichtliche Fehlverhalten gefunden werden, der "eigentliche Verursacher" blieb aber bis dahin unentdeckt.

Der geänderte Quellcode der NtlmHelper - Klasse ist nachfolgend aufgeführt:

package org.owug.otwsm.inlinefunction;
import org.apache.commons.codec.binary.Base64;
public class NtlmHelper
{
    public String ntlmTypeOne(String auth)
    {
        String result = "1";
        byte msg[] = Base64.decodeBase64(auth.substring(5));
        if(msg[8] == 1)
        {
            byte z = 0;
            /* old NTLM byte array code does not work on all Windows10 clients
            byte msg1[] = {
                78, 84, 76, 77, 83, 83, 80, z, 2, z, 
                z, z, z, z, z, z, 40, z, z, z, 
                1, -126, z, z, z, 2, 2, 2, z, z, 
                z, z, z, z, z, z, z, z, z, z 
            }
            */
            /* new NTLM byte array code works */
            byte[] msg1 = {
                (byte) 'N', (byte) 'T', (byte) 'L', (byte) 'M', 
                (byte) 'S', (byte) 'S', (byte) 'P',
                z, (byte) 2, z, z, z, z, z, z, z, (byte) 40, z, z, z, 
                (byte) 1, (byte) 130, (byte) 8, z, z, (byte) 2, (byte) 2, (byte) 2,
                z, z, z, z, z, z, z, z, z, z, z, z
            };
            result = Base64.encodeBase64String(msg1);
            return result;
        } else
        {
            return "Error NTLM-Typ 1";
        }
    }
    public String ntlmTypeThree(String auth)
    {
        String result = "3";
        int off = 0;
        byte msg[] = Base64.decodeBase64(auth.substring(5));
        if(msg[8] == 3)
        {
            off = 30;
            int length = msg[off + 17] * 256 + msg[off + 16];
            int offset = msg[off + 19] * 256 + msg[off + 8];
            result = new String(msg, offset, length);
            length = msg[off + 1] * 256 + msg[off];
            offset = msg[off + 3] * 256 + msg[off + 2];
            result = new String(msg, offset, length);
            length = msg[off + 9] * 256 + msg[off + 8];
            offset = msg[off + 11] * 256 + msg[off + 10];
            result = new String(msg, offset, length);
            return result;
        } else
        {
            return "Error NTLM-Typ 3";
        }
    }
}

Hinwies: Wie sich später herausstellte, war auf den Windows10 Clients der "Windows Defender Credential Guard" aktiv und verhinderte bzw. blockiert das Senden von NTLM.

Kudo geht an Achim Hermes für das ausführliche Testen und die Ermittlung des "Credential Guard" als blockierende Stelle von NTLM-Anfragen.


Über den Autor:
Holm Gehre

Holm Gehre ist seit Mitte 2017 Senior Softwareentwickler und Projektleiter bei CHEFS CULINAR und betreut dort mit seinem Team die Opentext-Plattform. Seit dem Jahr 2001 und bis Mitte des Jahres 2017 betreute und entwickelte er Opentext- (vormals RedDot-) basierte Webseiten nationaler und internationaler Kunden auf Basis von Management und Delivery Server.