Hello Joey, 

> -----Ursprüngliche Nachricht-----
> Von: Joey Cochran <joey.coch...@mtsu.edu>
> Gesendet: Mittwoch, 19. März 2025 18:27
> An: users@tomcat.apache.org
> Betreff: RE: JNDIRealm with required ChannelBindingToken fails
> 
> On 2025/03/19 08:02:43 "Thomas Hoffmann (Speed4Trade GmbH)" wrote:
> > Hello Michael,
> >
> > > -----Ursprüngliche Nachricht-----
> > > Von: Michael Osipov <micha...@apache.org>
> > > Gesendet: Dienstag, 18. März 2025 22:50
> > > An: users@tomcat.apache.org
> > > Betreff: Re: JNDIRealm with required ChannelBindingToken fails
> > >
> > > On 2025/03/18 16:22:42 "Thomas Hoffmann (Speed4Trade GmbH)"
> wrote:
> > > > Hello Tomcat-Team,
> > > > we are currently using a JNDIRealm to authenticate against an
> > > ActiveDirectory via LDAPs.
> > > > For security reasons, the LDAP-Server should be configured to
> > > > enforce
> > > channel binding token (CBT).
> > > >
> > > > If CBT is set to enforced however, the JNDIRealm fails with this
> exception:
> > > >
> > > > org.apache.catalina.realm.JNDIRealm.getPrincipal Exception
> > > > performing
> > > authentication
> > > > javax.naming.AuthenticationException: [LDAP: error code 49 -
> 80090346:
> > > LdapErr: DSID-0C0906AD, comment: AcceptSecurityContext error,
> data
> > > 80090346, v4563 ]; remaining name 'ou=xxx,dc=com'
> > > > at
> > >
> java.naming/com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3260
> > > )
> > > > ...
> > > >
> > > > Java should support CBT since version 16 according to these pages:
> > > https://bugs.openjdk.org/browse/JDK-8258824
> > > https://bugs.openjdk.org/browse/JDK-8247311
> > > >
> > > > It mentions, that a JNDI environment property
> > > "com.sun.jndi.ldap.tls.cbtype" should be set, to make JNDI work with
> CBT.
> > > >
> > > > Looking at the class JNDIRealm.java -->
> > > getDirectoryContextEnvironment() I can't find any property with this
> > > name or any way to inject additional properties.
> > > >
> > > > The realm configuration in Tomcat is quite common, nothing special:
> > > > <Realm className="org.apache.catalina.realm.JNDIRealm"
> > > >                 adCompat="true"
> > > >                 allRolesMode ="authOnly"
> > > >                 connectionTimeout="3000"
> > > >                 connectionURL="ldaps://server1:636"
> > > > ...
> > > >                 useDelegatedCredential="true"
> > > >                 spnegoDelegationQop="auth"
> > > > />
> > > >
> > > > Does anybody have succeeded in JNDIReal with CBT?
> > > > Could the connection issue be solved with standard methods?
> > >
> > > There is none and the JNDIRealm does not provide a way to pass
> > > arbitrary properties to the DirContext. you best shot is to extend
> > > the class, override
> > > getDirectoryContextEnvironment() and pass the desired property.
> > >
> > > It was actually backported to older versions:
> > > https://bugs.openjdk.org/browse/JDK-8245527
> > >
> > > My recommendation is to test it in an isolated environment first:
> > > * Plain DirContext
> > > * ldapsearch(1) + Cyrus SASL
> > >
> > > In our huge interprise this isn't enforced, I guess that qop-auth is
> > > still good enough with aes256-cts-hmac-sha1-96 (SSF 256). Even back
> > > then when I co-reviewed the PR I did not fully understand what the
> > > huge benefit of TLS- CB is if you have AES-256 and auth-conf with
> > > Kerberos, but I am not a security expert.
> > >
> > > Michael
> > >
> >
> > Thank you for your quick reply and confirmation of the current situation.
> > I can test if overriding the getDirectoryContextEnvironment() works.
> 
> Pleaso do.
> 
> > As far as I understood the CBT is created by some connection parameters
> and prevents MITM attacks via an SSL-Proxy (like Strict-Transport-Security
> for HTTP does on a higher level).
> 
> Why not just use qop="auth-conf" and avoid TLS altogether? Kerberos will
> give you all the security you need. I see usecases for the paranoid, but a
> regular r/o call.
> 
> > Would it be worth to create a feature request for Tomcat?
> > Companies get more sensitive about security features nowadays and the
> complexity of the feature doesn’t look very high.
> 
> I'd prefer a generic solution for arbitrary properties like:
> > additionalProperties="name=value;name2=value2;…"
> 
> Michael
> 
> I am just curious... is this a JAVA_OPT at runtime?
>       -Dcom.sun.jndi.ldap.tls.cbtype=enforce
> 
> what are the enumerated values?
> -Joey

It is hard to find examples on this topic.
One of the pages  I found is 
https://download.java.net/java/early_access/loom/docs/api/java.naming/module-summary.html
The possible values determine how the token is generated:
1) tls-server-end-point
2) tls-unique
Whereas 2) is not implemented.

According to this page, the property is not a system property but an JNDI 
environment property.
Thus I assume, that it must look like this (non-working?) example: 
https://stackoverflow.com/questions/64392108/connecting-to-ldaps-with-gss-and-channel-binding
  

Hashtable props = new Hashtable();
props.put("com.sun.jndi.ldap.tls.cbtype", "tls-server-end-point");
new InitialLdapContext(props, null);

Haven't tried it though

Greetings, Thomas

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

Reply via email to