문제

현재 KRBException : MyRBException : Myrypted Field의 무결성 점검이 GSS 데모 응용 프로그램 (서버 측)에서 실패했습니다 (31). 이제 나는 이것의 이유를 찾고 있습니다. 나는 의심의 여지가있다.

  1. 클라이언트 및 서버 응용 프로그램은 동일한 컴퓨터 (LocalHost) 및/또는
  2. SPN은 다른 기계 (컴퓨터)에 대해 생성되었습니다.

두 번째는 서비스 교장이 기계 xxx0815.domain.net에 대해 생성되었으므로 SPN은 http/xxx0815.domain.net@domain.net입니다. 그리고 내 컴퓨터는 그다지는 아니지만 서버의 로그인 메소드가 성공하도록 KeyTab 파일을 얻었습니다.

올바르게 의심됩니까, 아니면 다른 실수를하고 있습니까?

서버 구성 및 소스 코드 :
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 (보일러 플레이트 생략)

    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();

클라이언트 구성 및 소스 코드 :
Client.conf

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

gssclient.java (보일러 플레이트 생략)

    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();

나가는 네트워크 데이터를 확인했습니다. 양쪽에서 동일하게 문제를 배제 할 수 있으므로 출력을 인코딩 한 다음 스트림을 통해 보낼 수 있습니다. 잘못 ...).

내가 얻는 예외 :

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
도움이 되었습니까?

해결책

무결성 검사에 실패하면 데이터가 올바르게 전송 / 수신되지 않았 음을 나타냅니다 (또는 이는 잘못된 오류 메시지입니다). 즉, 일부 수정이 발생했습니다.

전송 된 데이터가 네트워크 수준에서 수신 된 데이터와 일치하는지 확인했지만 보내기 전에 또는 영수증 후에 손상되지 않았다고 확신합니까? 먼저 코드를 검토하는 것이 좋습니다.

편집 : 귀하의 질문에 대한 답변으로 서비스 교장 (실제로 모든 티켓)은 특정 컴퓨터에 구속 될 수 있지만 일반적으로 IP 주소로 수행됩니다. 어쨌든 이와 같은 것이 다른 레벨 오류가 발생해야합니다.

당신이 얻는 오류는 처음에 티켓을 해독하는 데 어려움을 겪고있는 것처럼 들립니다. 그 원인은 KeyTab 복사와 관련이있을 수있는 잘못된 키를 사용하고 있기 때문입니다. kerberos가 기본적으로 키 관리 프로토콜을 제공하기 때문에 잘못된 티켓을 사용하여 잘못된 키를 발생시킬 수 있습니다. 오래된/잘못된 티켓을 캐시했을 가능성이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top