정말 잘못되어서 사과 드리겠습니다. GSSAPI와 JAAS에 관한 많은 정보를 찾기가 정말 어려웠습니다.GSSAPI Defective Ticket
IIS 서버에 요청하고 Kerberos를 사용하여 인증하는 프로그램을 작성하고 있습니다.
두 대의 VM이 있습니다. 첫 번째는 Active Directory 도메인 컨트롤러입니다. 다른 하나는 IIS 서버를 실행 중입니다.
내 컴퓨터에서 GSSAPI 및 JAAS를 사용하여 인증하는 프로그램을 실행하고 있습니다. 꽤 무겁게 the Oracle tutorials for GSSAPI에 기반을두고 있습니다.이 단계에서 나는 그저 내 머리를 쓰려고 노력하고 있습니다. KrbLoginModule을 사용하여 로그인하면 도메인에서 주어진 테스트 사용자를 기반으로 제목을 만들 수 있습니다. 모든 테스트 사용자는 정상적으로 작동하는 것으로 보입니다. 네트워크 추적에는 AS-REQ, AS-REP, TGS-REQ 및 TGS-REP가 있습니다 (올바른 것이면 내 시스템과 도메인 컨트롤러 VM간에 있음).
내 프로그램은 위에서 생성 된 주제를 사용하여 대부분 code from the GSSAPI/JAAS tutorial을 기반으로하는 일부 GSSAPI 코드를 실행합니다. 이름/자격/컨텍스트를 오류없이 생성하지만 컨텍스트 설정을 시도하면 문제가 발생하기 시작합니다.
나는 원래 (위 링크) 튜토리얼에서 어떻게하는지 상황에 맞는 루프를하고 있었다하지만 서버에서 토큰을 읽기 시작하려고 할 때 (즉, token = new byte[inStream.readInt()];
)는 length
그것은 거대했다 읽을 int입니다 (1213486160, 몇 시간 나는 그것을 검사한다 - 그것은 항상 그 것처럼 보였다). 이로 인해 OutOfMemoryError가 발생했습니다.
그런 다음 입력 스트림과 출력 스트림을 가져 오는 initSecContext의 "Stream version"을 사용하기 시작했습니다. (저는 서버에 열어 놓은 소켓의 입/출력 스트림을 제공했습니다. 이것은 처음에는 꽤 잘 작동하는 것 같습니다. 하나 이상의 반복을 설정하지만 메시지를 랩/언랩하려고하면 다시 잘못되기 시작합니다. 이에 대한 네트워크 추적이 생성 된 토큰과 같은 길이의 TCP 메시지를 (나는 그것이 랩 토큰 존재가 될 것이라고 믿고있어 보여줍니다
org.ietf.jgss.GSSException, major code: 10, minor code: 0
major string: Defective token
minor string: Bad token tag: 7284
: 당신이 메시지를 풀다하려고하면 오류가 발생합니다 보낸). 그런 다음 ICMP 리디렉션이 있습니다. 이것이 아무것도 아닌지 잘 모르겠다.하지만 나는 그것을 언급 할 것이라고 생각했다. (나는 그것이 첫 번째 TCP 메시지의 거의 전체를 포함하고 있음을 발견했다).
그러면 HTTP 응답이 있습니다. 그것은 400 나쁜 요청이야. 응답 본문에서는 잘못된 동사라고 말합니다. (동사가 "GET"또는 "POST 등의 의미"라고 가정 할 때 추측합니다.) 또한 추적은 첫 번째 TCP 메시지입니다. 약간의 인터넷 검색 결과로 a guy who had a similar problem이 발견되었습니다. 요청한 헤더가 어긋나는 바이러스 백신에 관한 내용이었습니다 (리디렉션과 관련이있을 수 있습니다).
내 컴퓨터에서 몇 개의 TCP 메시지 (연속 3 개) (서버에서 wrap 메서드를 사용하여 메시지를 보내고있는 데이터가 포함되어 있음)가 뒤 따르는 길이 = 0 TCP 승인 메시지
그래서 나는 ' 무슨 일이 일어날 지 모르겠다. (아마 리다이렉트 일지 모르지만 그렇게 보이지는 않을 것이다.)
UPDATE :
내가 (동일한 Active Directory 도메인에)이 다른 VM에 그것을 실행하는거야하지만 여전히 HTTP 400 잘못된 요청 응답을 얻고있다. 이전과 달리 Kerberos를 확실히 사용하고 있습니다 (상기에서는 NTLM 요청을 보냈습니다).
네트워크 추적은 AS 및 TGS 요청 및 응답을 표시 한 다음 티켓을 전송합니다. 그런 다음 IIS 서버는 잘못된 요청 (다시 말하면 잘못된 동사)을 반환합니다. 미묘한 차이점이 있습니다. 잘못된 요청 응답은 더 이상 보내지는 토큰에 대한 승인을받지 못합니다. 그러나 400 이전에 오는 빈 ack TCP 메시지가 있습니다.
프로그램은 여전히 컨텍스트가 설정되었다고 생각하지만,
General failure, unspecified at GSSAPI level
minor string: Error in method wrap, error: java.net.SocketException:
Unrecognized Windows Sockets error: 0: socket write error
UPDATE : 내가 initSecContext에와 토큰 읽을 때, 앞서 언급 한 바와 같이
, 내가 먼저 길이를 기대하고 있습니다 (즉, 당신이 메시지를 포장하려고하면, 그것은 함께 나누기 token = new byte[inStream.readInt()];
)을 참조하십시오. 내가 얻는 것은 OutOfMemoryError가 발생한 1213486160입니다. 그래도 1213486160은 ASCII 형식의 "HTTP"인 0x48545450이라는 것을 깨달았습니다. 그래서 다음 글자들을 읽고 "응답 토큰"은 HTTP 400 잘못된 요청입니다.
자습서에 표시된 길이만큼 정수를 읽어야하는지 여부를 묻습니다. 이 질문이 다소 다르기 때문에 new question here을 만들었습니다. 그것은 문제가되지 않을 수도 있습니다 (처음에는 "잘못된 요청"을 보내는 원인이 아닙니다). 그래서이 질문을 지금 당장 열어 두겠습니다.
ANOTHER UPDATE :
그래서 내가 initSecContext
에 의해 침을 Base64로 인코딩 된 점점 토큰 바라 보았다, 그것은 YII는 ... (즉, 토큰 협상)입니다.
크롬을 통해 로그인하고 AS 및 TGS 메시지를 보낸 후에도 네트워크 추적을 면밀히 관찰 했으므로 Authorization : Negotiate YII .....의 헤더 행과 함께 HTTP GET 요청을 보냅니다. , 토큰의 길이와 함께 TCP 메시지를 보내는 내 프로그램과는 달리 토큰.
이렇게하면 (적어도 자습서에 표시된대로) 컨텍스트 단계를 설정할 필요가 없으며 토큰을 가져 와서 HTTP 요청으로 보내야한다고 제안합니다. 직선 TCP 메시지. GSSAPI/Kerberos를 사용하여이를 확인할 수있는 IIS를 인증 한 사람 (또는 사람의 사례 - 실제로 찾을 수없는 것 같습니다)이 있습니까?
나는 귀하의 질문에 대한 찬성표를 한 사람이었습니다. 훌륭한 세부 사항. 이제 내 질문 : 당신은 두 개의 VM이 있다고 말했습니다. 첫 번째는 Active Directory 도메인 컨트롤러이고 다른 하나는 실행중인 IIS 서버입니다. 여기를 확인하는 것만으로도 클라이언트 컴퓨터가이 Active Directory 도메인에 가입되어 있습니까? Kerberos 인증이 작동해야합니다. "결함있는 토큰"은 일반적으로 서버가 Kerberos 인증 토큰을 원할 때 클라이언트 컴퓨터가 NTLM 인증 토큰을 보낸 것을 의미합니다. –
같은 도메인에 있지는 않지만 현재 DNS에 도메인 컨트롤러를 사용하고 있습니다. 나는 그것이 무엇을 의미하는지 모르겠다. 그러나 크롬에서 IIS 서버의 "위치"로 갈 때 Kerberos를 사용하는 것 같다. (모든 AS/TGS - REQ/REP 등). – dram
이제 Chrome에서 다시 두 번 체크인했습니다. 이제는 NTLM을 사용하고 있습니다. 어쩌면 나는 최근에 뭔가를 바꿨을 것이다. 나는 그것을 작동 시키려고 애 쓰고 있었고, 다양한 설정 옵션을 시도해 보았다. 아마 이것이라고 말할 수 있습니다. – dram