Domanda

Al momento sto ottenendo una KrbException: il controllo di integrità sul campo decrittografato non è riuscito (31) con la mia applicazione demo GSS (sul lato server). Ora sto cercando il motivo per questo. Ho il sospetto che derivi dal fatto che

  1. il client e l'applicazione server vengono eseguiti sullo stesso computer (localhost) e / o
  2. l'SPN è stato generato per un'altra macchina (computer)

Il secondo significa che l'entità servizio è stata generata per una macchina xxx0815.domain.net, quindi l'SPN è HTTP/xxx0815.domain.net@DOMAIN.NET. E la mia macchina non è quella, ma ho il file keytab in modo che il metodo di accesso del server abbia successo.

Sospetto correttamente o sto commettendo un altro errore?

Configurazione del server e codice sorgente:
server.conf

Server { 
    com.sun.security.auth.module.Krb5LoginModule 
        required 
        isInitiator=false 
        doNotPrompt=true 
        useKeyTab=true 
        keyTab="gssdemo.keytab" 
        storeKey=true 
        principal="HTTP/xxx0815.domain.net@DOMAIN.NET" 
        debug=true; 
};

GSSServer.java (omesso il materiale del boilerplate)

    GSSManager manager = GSSManager.getInstance();
    GSSName serverName = manager.createName(getServerName(), null);
    GSSCredential serverCred = manager.createCredential(serverName,
                                                        GSSCredential.INDEFINITE_LIFETIME,
                                                        createKerberosOid(),
                                                        GSSCredential.ACCEPT_ONLY);
    GSSContext context = manager.createContext(serverCred);
    System.out.println("Context created successfully. Now incoming tokens could be accepted.");

    ServerSocket serverSocket = new ServerSocket(55555);
    SocketAdapter ca = new SocketAdapter(serverSocket.accept());

    while (!context.isEstablished()) {
        byte[] inToken = ca.readToken();
        byte[] outToken = context.acceptSecContext(inToken, 0, inToken.length);

        if (outToken != null) {
            ca.sendToken(outToken);
        }
    }

    System.out.println("Context established");
    System.out.println("Connected user is: " + context.getSrcName());
    context.dispose();

Configurazione client e codice sorgente:
client.conf

Client {
    com.sun.security.auth.module.Krb5LoginModule
        required
        useTicketCache=true
        debug=true;
};

GssClient.java (boilerplate omesso)

    GSSManager manager = GSSManager.getInstance();
    GSSName clientName = manager.createName(getClientName(), null);
    GSSCredential clientCred = manager.createCredential(clientName,
                                                        8 * 3600,
                                                        createKerberosOid(),
                                                        GSSCredential.INITIATE_ONLY);
    GSSName serviceName = manager.createName("HTTP/xxx0815.domain.net@DOMAIN.NET", null);

    GSSContext context = manager.createContext(serviceName,
                                               createKerberosOid(),
                                               clientCred,
                                               GSSContext.DEFAULT_LIFETIME);
    context.requestMutualAuth(true);
    context.requestConf(false);
    context.requestInteg(true);

    System.out.println("Establishing context");
    SocketAdapter ca = new SocketAdapter(new Socket("localhost", 55555));

    byte[] inToken = new byte[0];
    while (true) {
        byte[] outToken = context.initSecContext(inToken, 0, inToken.length);

        if (outToken != null) {
            ca.sendToken(outToken);
        }

        if (context.isEstablished()) {
            break;
        }

        inToken = ca.readToken();
    }

    System.out.println("Context established: " + context.isEstablished());

    context.dispose();

Ho controllato i dati di rete in uscita e in entrata - è lo stesso su entrambi i lati, quindi posso escludere un problema lì (ho codificato BASE64 l'output e poi lo invio semplicemente attraverso i flussi. Penso che non ci sia molto che può andare storto lì ...).

L'eccezione che ottengo:

Caused by: GSSException: Failure unspecified at GSS-API level (Mechanism level: Integrity check on decrypted field failed (31))
    at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:741)
    at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:323)
    at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:267)
    at de.westlb.mrm.sandbox.gss.GssServer.acceptAndEstablish(GssServer.java:88)
    at de.westlb.mrm.sandbox.gss.GssServer.run(GssServer.java:66)
    ... 4 more
Caused by: KrbException: Integrity check on decrypted field failed (31)
    at sun.security.krb5.internal.crypto.DesCbcEType.decrypt(DesCbcEType.java:154)
    at sun.security.krb5.internal.crypto.DesCbcMd5EType.decrypt(DesCbcMd5EType.java:33)
    at sun.security.krb5.internal.crypto.DesCbcEType.decrypt(DesCbcEType.java:125)
    at sun.security.krb5.internal.crypto.DesCbcMd5EType.decrypt(DesCbcMd5EType.java:33)
    at sun.security.krb5.EncryptedData.decrypt(EncryptedData.java:168)
    at sun.security.krb5.KrbApReq.authenticate(KrbApReq.java:267)
    at sun.security.krb5.KrbApReq.<init>(KrbApReq.java:134)
    at sun.security.jgss.krb5.InitSecContextToken.<init>(InitSecContextToken.java:79)
    at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:724)
    ... 8 more
È stato utile?

Soluzione

Se il controllo di integrità fallisce, ciò suggerisce che i dati non vengono inviati / ricevuti correttamente (questo o questo è un messaggio di errore errato). In altre parole, si sono verificate alcune modifiche.

So che dici di aver verificato che i dati inviati corrispondono ai dati ricevuti a livello di rete, tuttavia sei sicuro che non siano danneggiati prima dell'invio o dopo la ricezione? Ti suggerirei di rivedere il tuo codice per questo.

modifica: in risposta alla tua domanda, un'entità servizio (in realtà, qualsiasi ticket) può essere associata a una macchina specifica, ma ciò avviene normalmente in termini di indirizzo IP. In ogni caso qualcosa del genere dovrebbe comportare un diverso errore di livello superiore.

L'errore che stai ricevendo suona come se avesse problemi a decifrare il biglietto in primo luogo. Una possibile causa di ciò è che sta usando la chiave sbagliata, che potrebbe essere correlata alla tua copia del keytab. Una chiave errata può anche essere causata dall'uso del ticket errato (poiché kerberos fornisce sostanzialmente un protocollo di gestione delle chiavi). È possibile che tu abbia memorizzato nella cache un biglietto vecchio / errato?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top