Подтвердить что ты не робот

Использование Java 8 S4U2Proxy - нужен хороший пример

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

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. Выжил, что по крайней мере один пример должен был быть предоставлен документацией Oracle. Во всяком случае, я сейчас перехожу к следующему этапу. Теперь другой сценарий, который мне нужно обработать, - это делегирование сертификата между серверами kerberos. Из документации java 8, которую я видел до сих пор, она указывает, что в настоящее время межрежим не поддерживается. Это правда?

4b9b3361

Ответ 1

Я создал полное автономное демонстрационное приложение для функций расширения Kerberos SFU в 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 не поддерживает показ трансверсальности: обратитесь к JDK-8005819

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

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