Tomcat не может пройти аутентификацию, используя spnego, "Не удается найти область по умолчанию"

Я использую http://spnego.sourceforge.net/spnego_tomcat.html учебное пособие, чтобы попытаться настроить Tomcat для использования spnego.

Hello_KDC.java сработал, и я смог пройти проверку подлинности. И если я использую неправильный пароль, я получаю исключение ошибки, поэтому он работает.

Но когда я пытаюсь использовать это руководство для Tomcat, оно ломается. Tomcat ROOT/index.jsp становится пустым, и при мониторинге я вижу, что он возвращает 404. log\host-manager.2013-02-22.log имеет следующее:

Fev 22, 2013 1:39:03 PM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter SpnegoHttpFilter
javax.servlet.ServletException: javax.security.auth.login.LoginException: Cannot locate default realm
    at net.sourceforge.spnego.SpnegoHttpFilter.init(SpnegoHttpFilter.java:198)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4656)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5309)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1114)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1673)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: javax.security.auth.login.LoginException: Cannot locate default realm
    at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Unknown Source)
    at com.sun.security.auth.module.Krb5LoginModule.login(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at javax.security.auth.login.LoginContext.invoke(Unknown Source)
    at javax.security.auth.login.LoginContext.access$000(Unknown Source)
    at javax.security.auth.login.LoginContext$4.run(Unknown Source)
    at javax.security.auth.login.LoginContext$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.login.LoginContext.invokePriv(Unknown Source)
    at javax.security.auth.login.LoginContext.login(Unknown Source)
    at net.sourceforge.spnego.SpnegoAuthenticator.<init>(SpnegoAuthenticator.java:161)
    at net.sourceforge.spnego.SpnegoHttpFilter.init(SpnegoHttpFilter.java:196)
    ... 17 more
Caused by: KrbException: Cannot locate default realm
    at sun.security.krb5.PrincipalName.<init>(Unknown Source)
    ... 32 more
Caused by: KrbException: Cannot locate default realm
    at sun.security.krb5.Config.getDefaultRealm(Unknown Source)
    ... 33 more
Caused by: KrbException: Generic error (description in e-text) (60) - Unable to locate Kerberos realm
    at sun.security.krb5.Config.getRealmFromDNS(Unknown Source)
    ... 34 more

Это происходит во время запуска tomcat перед загрузкой любой страницы из браузера. Когда я пытаюсь загрузить страницу, журнал не добавляется.

В krb5.conf я пробовал и имя хоста и IP и получаю ту же ошибку. krb5.conf и login.conf находятся, потому что, если я их удаляю, я получаю этот журнал:

Fev 22, 2013 1:46:05 PM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter SpnegoHttpFilter
java.lang.SecurityException: login.conf (tal arquivo ou diretório não existe)
    at com.sun.security.auth.login.ConfigFile.<init>(Unknown Source)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at javax.security.auth.login.Configuration$3.run(Unknown Source)
    at javax.security.auth.login.Configuration$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.login.Configuration.getConfiguration(Unknown Source)
    at net.sourceforge.spnego.SpnegoFilterConfig.doClientModule(SpnegoFilterConfig.java:176)
    at net.sourceforge.spnego.SpnegoFilterConfig.<init>(SpnegoFilterConfig.java:138)
    at net.sourceforge.spnego.SpnegoFilterConfig.getInstance(SpnegoFilterConfig.java:314)
    at net.sourceforge.spnego.SpnegoHttpFilter.init(SpnegoHttpFilter.java:193)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4656)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5309)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1114)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1673)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: login.conf (tal arquivo ou diretório não existe)
    at com.sun.security.auth.login.ConfigFile.init(Unknown Source)
    ... 32 more

Есть идеи, что может происходить?

3 ответа

Одна из возможных причин исключения KrbException: Cannot locate default realm является то, что модуль входа не может найти ваш krb5.conf,

В инструкциях по настройке Tomcat для встроенной проверки подлинности Windows указано, что krb5.conf должен быть помещен в домашний каталог Tomcat, например, C:\Tomcat\, если вы работаете в Windows.

В общем, однако, (то есть, не относится к проекту Sourceforge, на который вы ссылаетесь) местоположения по умолчанию, которые модуль входа в систему будет искать krb5.conf определены здесь:

Если установлено системное свойство java.security.krb5.conf, предполагается, что его значение указывает путь и имя файла.

Если это значение системного свойства не установлено, то файл конфигурации ищется в каталоге:

  • \ lib \ security (Windows)
  • / lib / security (Solaris и Linux)

Если файл все еще не найден, делается попытка найти его следующим образом:

  • /etc/krb5/krb5.conf (Solaris)
  • c: \ winnt \ krb5.ini (Windows)
  • /etc/krb5.conf (Linux)

Установка некоторых дополнительных свойств для активации ведения журнала отладки может помочь определить, где именно ваше приложение ищет файл krb5.conf:

System.setProperty("sun.security.krb5.debug", "true");

Отладочный вывод может напечатать некоторые или все из следующих в зависимости от вашего случая:

Системное свойство java.security.krb5.conf не задано, поэтому модуль ищет в системных местах по умолчанию:

Java config name: null
Native config name: /etc/krb5.conf
Loaded from native config

Системное свойство java.security.krb5.conf установлено и файл найден:

Java config name: krb5.conf
Loaded from Java config

Системное свойство java.security.krb5.conf установлено, но файл не найден:

Java config name: krb5.conf

Обратите внимание, что в последнем примере нет подтверждения, что конфигурация была загружена. В этом сценарии вы увидите сообщение об исключении: KrbException: Cannot locate default realm)

Это может означать две вещи:

  1. Ваш krb5.conf неправильно настроен
  2. Ваша машина tomcat находится в области, где нет KDC

Вот пример krb5.conf для справки. Обратите внимание на то, что в этом случае мой хостинг tomcat находится на KERBOS.COM

[libdefaults]
default_realm = KERBOS.COM
ticket_lifetime = 36000

[realms]
KERBOS.COM = {
kdc = 10.1.2.3
admin_server = INQS28KERB01
default_domain = KERBOS.COM
}

[domain_realm]
.mycompany.com = KERBOS.COM

[appdefaults]
autologin = true
forward = true
forwardable = true
encrypt = true

Для меня это работает. Пожалуйста, предоставьте ваш krb5.conf для деталей. Кроме того, пожалуйста, также предоставьте редактирование фильтра tomcat, которое вы сделали, возможно, что-то там неправильно настроено.

У меня была такая же проблема только минуту назад и я понял, что мой файл krb5.conf не был в правильном месте в моей файловой структуре. Он должен быть расположен в:

Серверы> Tomcat

Серверы> Tomcat > bin

Вот как я настроил свою работу на работе, и теперь все работает. Я изменил рабочие пространства, и мне нужно было добавить это, чтобы он работал правильно.

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