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)
Это может означать две вещи:
- Ваш krb5.conf неправильно настроен
- Ваша машина 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
Вот как я настроил свою работу на работе, и теперь все работает. Я изменил рабочие пространства, и мне нужно было добавить это, чтобы он работал правильно.