2009-09-30 3 views
4

this question을 묻는 후, 나는 NegotiateStream을 사용하여 Java 클라이언트에 대해 Windows 클라이언트를 인증하려고 노력해 왔습니다. Java에 훌륭한 NTLM 라이브러리 지원이없는 것 같습니다. 그래서 Kerberos를 사용해야한다는 가정하에 작업하고 있습니다. Java는 GSS-API를 통해 훨씬 더 잘 지원하는 것 같습니다.NegotiateStream에서 Kerberos를 사용하는 방법?

문제는 NegotiateStream이 매번 NTLM을 사용하려고 시도하는 것입니다. 문서에서는 두 가지 중 하나를 사용할 수 있다고 제안하지만 선택 방법을 지정하지는 않습니다. 내가 선택한 메커니즘을 제어하기 위해 API에서 옵션을 볼 수 없습니다. 방법이 있습니까?

나 자신에게 서비스 사용자 이름을 가지고 내 클라이언트 코드는 다음과 같습니다 : 서버 측에

string spn = "<service-name>/<my-pc-name>" 
TcpClient client = new TcpClient(server, port); 
NetworkStream stream = client.GetStream(); 
NegotiateStream neg = new NegotiateStream(stream, true); 
neg.AuthenticateAsClient(CredentialCache.DefaultNetworkCredentials, spn); 

,받은 바이트의 첫 번째 세트는 22,1,0,0,59하고 그 다음 "NTLMSSP"- 나는 기대하지 않고 있었다.

SPN 문자열에 대해 몇 가지 다른 형식을 시도했지만 올바른 형식이 무엇인지 잘 모릅니다.

TEST/<my-pc-name>.<domain-name> 

내가 뭔가 잘못하고 있는가, 또는 완전히이 물건을 오해 : -L과 같이 성공적으로 나열 SETSPN 나는 원래

setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name> 

으로 SPN을 만들어? :)

+0

사용중인 운영 체제는 무엇입니까? –

+0

또한 myServicePrincipalName으로 무엇을 사용하고 있습니까? –

+0

이것은 현재 Vista64에서 실행 중입니다. myServicePrincipalName의 올바른 형식에 대해 약간 혼란 스럽습니다. tbh - 몇 가지 변형을 시도했습니다! 나는이 SPN을 만들었습니다 : setspn -A TEST/. 맞는지 확실하지 않습니다. : 그것은 SPN을 등록하고 S, 나는 TEST/을 나열 가 SPN -L <내 사용자 이름> 그것을 찾아 볼 수 있습니다. "TEST/my-pc-name", "TEST/my-user-name"및 둘 다 도메인 이름이 끝에 붙어 있습니다. 분명히 많은 추측이 있습니다. 훌륭한 문서를 찾지 못했습니다. ( –

답변

3

SPN 이름의 전체 구문은 <service>/<user>@DOMAIN입니다. 분명히 도메인 이름을 생략 할 수 있습니다. 그러나 사용자 이름이 my-pc-name.domain-name 인 경우 더 짧게해서는 안됩니다. spn -L과 같은 SPN을 제공하십시오.

+0

하, 덕분에 - 작동합니다. . 내가 너무 중복 보이는이 조합을 시도 할 생각하지 않았다 @ TEST/,하지만 난 그게 말이 생각이 아무튼 :. 도메인 이름) 그래서 구체적으로, 작동하는 문자열은 다음과 같습니다. @DOMAIN 없이도 작업 할 수 없으며 사용자 이름에도 도메인 이름이 필요합니다. 내일 SPN에 대해 질문을 올리겠습니다. gotiateStream은 유효한 SPN이 주어지면 Kerberos 만 사용하고, 그렇지 않으면 NTLM으로 조용히 떨어진다. 모든 도움을 주셔서 감사합니다. –

+0

내 생각 엔 KDC에서 서비스 티켓을 얻으려고합니다. KDC가 SPN을 알지 못하면 티켓을 발급하지 않고 NTLM (실제로 "서버 이름"이 필요하지 않음)으로 되돌아갑니다. –

관련 문제