Мое понимание получения сервисного билета было неверным. Мне не нужно получать учетные данные от службы - это невозможно на клиенте, потому что клиент на самом деле не имеет TGT для сервера и, следовательно, не имеет прав на получение учетных данных службы.
Чего здесь не хватает, так это создать новый GSSContext и инициализировать его. Возвращаемое значение из этого метода содержит билет службы, если я правильно понял. Вот пример рабочего кода. Он должен быть запущен в привилегированном действии от имени зарегистрированного субъекта:
GSSManager manager = GSSManager.getInstance();
GSSName clientName = manager.createName("clientUser", GSSName.NT_USER_NAME);
GSSCredential clientCred = manager.createCredential(clientName,
8 * 3600,
createKerberosOid(),
GSSCredential.INITIATE_ONLY);
GSSName serverName = manager.createName("http@server", GSSName.NT_HOSTBASED_SERVICE);
GSSContext context = manager.createContext(serverName,
createKerberosOid(),
clientCred,
GSSContext.DEFAULT_LIFETIME);
context.requestMutualAuth(true);
context.requestConf(false);
context.requestInteg(true);
byte[] outToken = context.initSecContext(new byte[0], 0, 0);
System.out.println(new BASE64Encoder().encode(outToken));
context.dispose();
Содержимое outToken содержит служебный билет. Однако это не тот способ, которым GSS-API предназначался для использования. Его целью было скрыть эти детали в коде, поэтому лучше установить GSSContext, используя GSS-API с обеих сторон. В противном случае вы действительно должны знать, что вы делаете из-за потенциальных дыр в безопасности.
Для получения дополнительной информации прочитайте учебник Sun SSO с Kerberos более внимательно, чем я.
EDIT:
Просто забыл, что я использую Windows XP с SP2. В этой версии Windows есть новая «функция», которая запрещает использование TGT в оперативной памяти Windows. Вы должны отредактировать реестр, чтобы разрешить это. Для получения дополнительной информации загляните в раздел Устранение неполадок JGSS на случай, если у вас возникнет «KrbException: KDC не поддерживает тип шифрования (14)», как я.