Есть ли способ в Java или утилите командной строки для получения билета Kerberos для службы, использующей собственный API SSPI?

Я хочу реализовать единый вход в Kerberos в Java, и мне удалось создать билет для Сервиса, используя билет из входа в Windows. К сожалению, я могу создать этот тикет, только если ключ реестра "allowtgtsessionkey" включен. Я получаю исключение с сообщением "Идентификатор не соответствует ожидаемому значению (906)", как только я его отключаю. Раздел реестра задокументирован по http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html и http://support.microsoft.com/kb/308339.

К сожалению, у меня нет доступа к реестру на компьютерах, где будет использоваться мое приложение, поэтому я ищу способ сделать это, не меняя его. Когда я делаю однократную регистрацию через SPNEGO в Internet Explorer или Mozilla Firefox, они создают билет службы в моем кэше билетов, поэтому определенно должен быть способ сделать это без установки ключа реестра. У кого-нибудь есть идеи, как это сделать на Java?

Спасибо за вашу помощь, меммингер

Обновление: я сдаюсь по этому вопросу. Раздел реестра Windows запрещает доступ к Билету (точнее: Предмету) внутри кеша Билета. Java в Windows использует собственную реализацию GSSAPI, и я полагаю, что для создания Service Ticket необходим доступ к Ticket. Windows API SSPI, тем не менее, имеет полный доступ к кешу билетов и, таким образом, может создавать билеты службы. Этот API используется веб-браузерами, но не используется Java (в соответствии с http://java.sun.com/developer/technicalArticles/J2SE/security/). Когда я отключаю SSPI в Firefox после однократного доступа к веб-странице (таким образом, был создан билет службы), я все равно могу получить доступ к странице, поэтому, возможно, будет достаточно утилиты командной строки, которая создает билет службы с помощью API SPPI.

Для нас это означает, что теперь мы можем либо отказаться от единого входа (что для нас неприемлемо), либо выполнить аутентификацию на стороне клиента нашего приложения (поскольку мы можем только считывать имя пользователя, но не проверять билет на сервер), что представляет собой серьезную угрозу безопасности. Другой пример того, как более сильные ограничения безопасности приводят к большим дырам в безопасности, потому что они становятся слишком сложными для использования.

4 ответа

Простите, если я неправильно понимаю вашу проблему, но...

Суть систем типа единого входа заключается в том, что клиент аутентифицируется непосредственно на (отдельном) сервере аутентификации и получает от него билет. Затем он передает билет целевому серверу (серверам), который он хочет использовать, каждый из которых проверяет, что билет действителен на сервере аутентификации. Если билет подтвержден, сервер может предположить, что клиент получил его только путем предоставления (доверенному) серверу Kerberos приемлемых учетных данных.

Нигде в процессе, любой сервер должен проходить аутентификацию от имени клиента. В такой системе единственным сервером, который должен знать и проверять учетные данные клиента, является сервер аутентификации - никакой другой сервер не должен иметь доступ к этой информации. Таким образом, клиент может проходить аутентификацию для многих серверов с помощью всего одного обмена аутентификацией, и учетные данные не подвергаются риску, поскольку хранятся или доступны для нескольких серверов.

Похоже, что ваша реализация работает так же, как и должна - аутентификация должна происходить на стороне клиента приложения, и это правильно, а не представляет угрозу безопасности.

Вы пытались установить sun.security.jgss.native в Java 6? Разве SSPI не будет "родным" интерфейсом для Windows?

Вы можете получить доступ к нативному API SSPI через JNA. См. Пример WindowsAuthProviderImpl в WAFFLE или WindowsNegotiateScheme из библиотеки Apache HC.

Встроенная поддержка Windows SSPI была введена в JDK 13, а позже также была перенесена в JDK 11. Вам нужно будет использовать как минимум Java 11.0.10. Когда JDK поддерживает SSPI, больше не нужно возиться с allowtgtsessionkey ключ реестра, и нет необходимости использовать JNA или Waffle.

Вам нужно установить

-Dsun.security.jgss.native=true

чтобы заставить его работать.

Вы можете узнать, поддерживает ли ваша версия JDK для Windows SSPI, если она включает файл с именем sspi_bridge.dll в bin каталог.

Ссылки:

JDK-6722928

Другие вопросы по тегам