Edward Siewick wrote:
Hi.

I'm trying to get a baseline configuration working, following the 
http://tomcat.apache.org/tomcat-7.0-doc/windows-auth-howto.html. I'm apparently 
off in the weeds having missed something, though. So I'd really appreciate a 
sanity check of my configuration, and the testcase I'm attempting.  I've got 
something messed up, and I'm looking for guidance on what to check.

Environment is:
Tomcat-7.0.33
Redhat RHEL 6.3
Linux openid-linux 2.6.32-279.el6.x86_64 #1 SMP Wed Jun 13 18:24:36 EDT 2012 
x86_64 x86_64 x86_64 GNU/Linux

AD is on a Win2008R2 server.
Client is MSIE on a Win2007 workstation. "Enable Integrated Windows 
Authentication" is set to true.

The MSA, keytab and Linux Kerberos bits seem to be OK. For completeness, here's 
what I've got.

setspn -A HTTP/openid-linux.openidmdev.com tomcat7
ktpass -princ 
HTTP/openid-linux.openidmdev....@openidmdev.com<mailto:HTTP/openid-linux.openidmdev....@openidmdev.com>
 -mapuser tomc...@openidmdev.com<mailto:tomc...@openidmdev.com> -crypto AES256-SHA1 -pass 
"mySecret,78."  -ptype KRB5_NT_PRINCIPAL -kvno 0 -out tomcat7.keytab

/etc/krb5.conf:

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = OPENIDMDEV.COM
 default_keytab_name = FILE:/usr/share/tomcat7c/conf/tomcat7.keytab
 default_tkt_enctypes = aes256-cts-hmac-sha1-96
 default_tgs_enctypes = aes256-cts-hmac-sha1-96
 forwardable = true
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d

[realms]
OPENIDMDEV.COM = {
    kdc = openiddc.openidmdev.com:88
    admin_server = openiddc.openidmdev.com
}
[domain_realm]
openidmdev.com  = OPENIDMDEV.COM
.openidmdev.com = OPENIDMDEV.COM

The krb5.conf generally works. Using my domain username and password:

kinit -V esiewick
Using default cache: /tmp/krb5cc_0
Using principal: esiew...@openidmdev.com<mailto:esiew...@openidmdev.com>
Password for esiew...@openidmdev.com<mailto:esiew...@openidmdev.com>:
Authenticated to Kerberos v5

The keytab contains one key:

klist -e -k /usr/share/tomcat7c/conf/tomcat7.keytab
Keytab name: WRFILE:/usr/share/tomcat7c/conf/tomcat7.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   0 
HTTP/openid-linux.openidmdev....@openidmdev.com<mailto:HTTP/openid-linux.openidmdev....@openidmdev.com>
 (aes256-cts-hmac-sha1-96)

The krb5 config is generally happy with the contents of the keytab:

kinit -V -k -t /usr/share/tomcat7c/conf/tomcat7.keytab  
HTTP/openid-linux.openidmdev....@openidmdev.com<mailto:HTTP/openid-linux.openidmdev....@openidmdev.com>
Using default cache: /tmp/krb5cc_0
Using principal: 
HTTP/openid-linux.openidmdev....@openidmdev.com<mailto:HTTP/openid-linux.openidmdev....@openidmdev.com>
Using keytab: /usr/share/tomcat7c/conf/tomcat7.keytab
Authenticated to Kerberos v5

So I'm confident the MSA and the keytab are OK.

The Tomcat7 configurations are localized, based on the descriptions in the 
windows-auth-howto.html.
For the Java options, the init script uses:

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server \
  -Djava.security.krb5.conf=/etc/krb5.conf \
  -Djava.security.auth.login.config=/usr/share/tomcat7c/conf/jaas.conf \
  -Djavax.security.auth.useSubjectCredsOnly=false \
  -Xms1536m \
  -Xmx1536m \
  -XX:NewSize=256m \
  -XX:MaxNewSize=256m \
  -XX:PermSize=256m \
  -XX:MaxPermSize=256m \
  -XX:+DisableExplicitGC"

/usr/share/tomcat7c/conf/jaas.conf is:

com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    
principal="HTTP/openid-linux.openidmdev....@openidmdev.com<mailto:HTTP/openid-linux.openidmdev....@openidmdev.com>"
    useKeyTab=true
    keyTab="/usr/share/tomcat7c/conf/tomcat7.keytab"
    storeKey=true
    debug=true;
};
com.sun.security.jgss.krb5.accept {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    
principal="HTTP/openid-linux.openidmdev....@openidmdev.com<mailto:HTTP/openid-linux.openidmdev....@openidmdev.com>"
    useKeyTab=true
    keyTab="/usr/share/tomcat7c/conf/tomcat7.keytab"
    storeKey=true
    debug=true;
};

In /usr/share/tomcat7c/conf/server.xml, I've simply uncommented:

<Valve className="org.apache.catalina.authenticator.SingleSignOn" />

For a testcase, I'm using the Tomcat7 "manager" webapp.
In /usr/share/tomcat7c/webapps/manager/WEB-INF/web.xml
I've simply adjusted:

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Tomcat Manager Application</realm-name>
  </login-config>
to:
  <login-config>
    <auth-method>SPNEGO</auth-method>
    <realm-name>Tomcat Manager Application</realm-name>
  </login-config>

For /usr/share/tomcat7c/conf/tomcat-users.xml:

<tomcat-users>
<role rolename="tomcat"/>
<role rolename="manager"/>
<role rolename="manager-gui"/>
<user username="esiew...@openidmdev.com<mailto:esiew...@openidmdev.com>" password="" 
roles="tomcat,manager,manager-gui"/>
</tomcat-users>

In actually trying to use this configuration,
http://openid-linux.openidmdev.com:8080/manager/status
gives HTTP 500 and logs:

Debug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt true 
ticketCache is null isInitiator true KeyTab is 
/usr/share/tomcat7c/confx/tomcat7.keytab refreshKrb5Config is false principal is 
HTTP/openid-linux.openidmdev....@openidmdev.com<mailto:HTTP/openid-linux.openidmdev....@openidmdev.com>
 tryFirstPass is false useFirstPass is false storePass is false clearPass is false

Key for the principal 
HTTP/openid-linux.openidmdev....@openidmdev.com<mailto:HTTP/openid-linux.openidmdev....@openidmdev.com>
 not available in /usr/share/tomcat7c/confx/tomcat7.keytab
                [Krb5LoginModule] authentication failed

Unable to obtain password from user

May 31, 2013 8:55:15 AM org.apache.catalina.authenticator.SpnegoAuthenticator 
authenticate
SEVERE: Unable to login as the service principal
javax.security.auth.login.LoginException: Unable to obtain password from user
at com.sun.security.auth.module.Krb5LoginModule.promptForPass(Unknown Source)
        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 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 
org.apache.catalina.authenticator.SpnegoAuthenticator.authenticate(SpnegoAuthenticator.java:215)
        at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931)
        at 
org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:309)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at 
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
        at 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
        at 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown 
Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
                [Krb5LoginModule]: Entering logout
                [Krb5LoginModule]: logged out Subject

I trust that the configuration at least is reading the jaas.conf, since the 
first line of logging refects its settings. However, I'm not convinced 
Krb5LoginModule is actually reading /usr/share/tomcat7c/conf/tomcat7.keytab; I 
can change:
keyTab="/usr/share/tomcat7c/conf/tomcat7.keytab"
to:
keyTab="/usr/share/tomcat7c/conf-junk/tomcat7.keytab"
and get the same log "Key for the principal...not available" result (+ "-junk" 
of course).

Well-founded guidance, clues, and even good guesses are all welcome.


Answering in the spirit of your last phrase above (because I really know nothing about the Tomcat SPNEGO Valve, and very little about Kerberos) :

The error message :

javax.security.auth.login.LoginException: Unable to obtain password from user
at com.sun.security.auth.module.Krb5LoginModule.promptForPass(Unknown Source)

would tend to indicate that something is trying to prompt the user for a 
password.
That should not really happen, in a Windows SSO mechanism, unless the Windows Domain Controller (to which the SPNEGO Valve is ultimately talking) is configured to accept HTTP Basic authentication as a fall-back for a Windows Integrated Authentication that doesn't work.

One reason for which WIA could possibly not work, would be if your Windows workstation does not consider the Tomcat server to which it is connecting, as at least a "trusted" server. In such a case, the *browser* will even refuse to start a WIA dialog with the server. So, first thing : are you sure that the workstation and the Tomcat server, from a Windows authentication point of view, are part of the same Windows Domain ? (And if you are not sure, and you are allowed to do this, what happens if you go into the IE settings, and add the tomcat hostname explicitly into the list of "trusted" servers ?).


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to