SPN (Service Principal Name)이 특정 컴퓨터에 바인딩됩니까?
문제
현재 KRBException : MyRBException : Myrypted Field의 무결성 점검이 GSS 데모 응용 프로그램 (서버 측)에서 실패했습니다 (31). 이제 나는 이것의 이유를 찾고 있습니다. 나는 의심의 여지가있다.
- 클라이언트 및 서버 응용 프로그램은 동일한 컴퓨터 (LocalHost) 및/또는
- 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가 기본적으로 키 관리 프로토콜을 제공하기 때문에 잘못된 티켓을 사용하여 잘못된 키를 발생시킬 수 있습니다. 오래된/잘못된 티켓을 캐시했을 가능성이 있습니까?