2015-06-25 2 views
8

Я пытаюсь использовать S4U2Proxy, представленный на Java 8. К сожалению, мне не удалось найти много примеров. Мое требование заключается в том, что клиент отправит свой сертификат. Затем я должен делегировать (используя kerberos) его запрос, подключаться к KDC, получать TGT, получать билет на услугу, чтобы связаться с другим сервером от имени пользователя, а затем, наконец, связаться с фактическим сервисом, предоставив билет на обслуживание. Если java 8 не обеспечивает чистый подход, можете ли вы указать мне другие утилиты, которые могут решить мои требования.Использование Java 8 S4U2Proxy - нужен хороший пример

Subject.doAs(subject, new PrivilegedAction<Object>() { 
     @Override 
     public Object run() { 
      GSSManager manager = GSSManager.getInstance(); 
      GSSCredential self = null; 
      try { 
       GSSName selfUser = manager.createName("serviceWhoWantstoImpersonate", GSSName.NT_USER_NAME); 
       Oid krb5Oid = new Oid("1.2.840.113554.1.2.2"); 
       self = manager.createCredential(selfUser.canonicalize(krb5Oid), GSSCredential.DEFAULT_LIFETIME, krb5Oid, GSSCredential.INITIATE_ONLY); 
       GSSName user = manager.createName(clientName, GSSName.NT_USER_NAME); 
       GSSCredential impCred = ((ExtendedGSSCredential) self).impersonate(user); 
      } catch (GSSException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 
    }); 

Очевидно, что будут вопросы о том, как SPN был установлен в KDC? Разрешена ли учетная запись службы для делегирования? Был ли назначен SPN для этой учетной записи службы? Когда пользователь «обезьяна» отрицает всякую делегацию? и т. д. Сейчас я чувствую, что внес правильные настройки в KDC. Моя проблема заключается в том, что это происходит еще до того, как она попадает в KDC. Любые действительные входы помогут.

EDIT: После некоторого повторного поиска я смог выполнить S4u2self и s4u2proxy с помощью java 8. Surpised, что по крайней мере один пример должен был быть предоставлен документацией Oracle. Во всяком случае, я сейчас перехожу к следующему этапу. Теперь еще один сценарий, который я должен обработать, - это делегирование сертификата междоменного kerberos. Из документации java 8, которую я видел до сих пор, она указывает, что в настоящее время межрежим не поддерживается. Это правда?

+0

Каждый имеет какой-либо решения? – Nischit

+0

Можно ли получить ответ с помощью фрагмента кода? –

ответ

2

Я построил полное применение автономной демонстрации для Kerberos СФУ функций расширений в Java 8: https://github.com/ymartin59/java-kerberos-sfudemo

Вот короткий фрагмент кода, который позволяет генерировать маркер SPNEGO с TGS билет для олицетворенного пользователя:

GSSManager manager = GSSManager.getInstance(); 
GSSName userName = manager.createName("targetUser", GSSName.NT_USER_NAME); 
GSSCredential impersonatedUserCreds = 
    ((ExtendedGSSCredential)serviceCredentials).impersonate(userName); 

final Oid KRB5_PRINCIPAL_OID = new Oid("1.2.840.113554.1.2.2.1"); 
GSSName servicePrincipal = 
    manager.createName("HTTP/webservice-host.domain.ltd", KRB5_PRINCIPAL_OID); 
ExtendedGSSContext extendedContext = 
    (ExtendedGSSContext) manager.createContext(servicePrincipal, 
              new Oid("1.3.6.1.5.5.2"), 
              impersonatedUserCreds, 
              GSSContext.DEFAULT_LIFETIME); 
final byte[] token = extendedContext.initSecContext(new byte[0], 0, 0); 

Опасайтесь extendedContext еще не установлен. Может потребоваться несколько раундов с сервером.

Java 8 Kerberos code не поддерживает кросс-область действия олицетворения еще: см JDK-8005819

Учетная запись службы Java может быть организована в одной области, и этот код можно ориентировать службу в другой области, насколько эта сфера будет явно добавлена ​​к SPN, как HTTP/[email protected]

таким же образом, для пользователей, известным в другой области, вы должны добавить его регистрационное имя в методе createName("[email protected]", GSSName.NT_USER_NAME)

+0

ваш демо-код на GitHub содержит некоторые ошибки. Я открою для этого проблему. –

+0

@ Yves - Вы знаете, поддерживает ли Java поддержку олицетворения Cross Realm и ограниченное делегирование? Кажется, это не поддерживается, но мне интересно, почему, если это не так. – manish

+0

@ItestonlyinProd Для поддержки ограниченного делегирования с помощью перекрестного взаимодействия некоторые дополнительные настройки в ActiveDirectory должны выполняться с помощью действий powershell ... но я еще не тестировал их (возможно, на этой неделе) –

Смежные вопросы