Hello Max, Thank you a lot for review.
Could you check the new version of the patch : http://cr.openjdk.java.net/~abakhtin/8245527/webrev.v4/ I’ve made the following changes: - TlsChannelBinding class is moved to java.naming module. java.security.sasl module is not affected any more - I pass tlsCB.getData() directly to the SASL mechanism as you suggested - I’ve made some guards to prevent application from using "com.sun.security.sasl.tlschannelbinding” property directly: - LdapClient verifies if internal property is not set - GssKrb5Client uses props.remove() to read and remove internal property Regards Alexey > On 5 Jun 2020, at 06:41, Weijun Wang <weijun.w...@oracle.com> wrote: > > Hi Alexey, > > It's so unfortunate that different addressType must be used. I'm OK with the > new TlsChannelBindingImpl class. > > One thing I'm not comfortable is the > java.security.sasl/share/classes/module-info.java change. We've struggled > hard to avoid these kind of secret tunnels. Is it possible to pass the > tlsCB.getData() directly to the SASL mechanism? The property name is clear > enough to avoid any misuse. > > Another question: can an application user set the > "com.sun.security.sasl.tlschannelbinding" property? and can they read it > after it's set internally? I cannot think of a good attack now but at least > it seems they have no need to access that property value. If we keep it > internal then we also have the chance to modify the approach later. > > Thanks, > Max > > >> On Jun 5, 2020, at 2:15 AM, Alexey Bakhtin <ale...@azul.com> wrote: >> >> Hello, >> >> Could you please review new version of the patch: >> http://cr.openjdk.java.net/~abakhtin/8245527/webrev.v3/ >> >> I’ve moved all logic for creating TLS Channel Binding data out of >> GssKrb5Client.java file. >> All data is prepared inside TlsChannelBinding class. >> Internal property name is renamed to >> “com.sun.security.sasl.tlschannelbinding”. >> TlsChannelBinding object is still used to pass channel binding data from >> LdapClient to GssKrb5Client. >> I do not change it to byte[] because of TlsChannelBinding class is still >> used for internal property name. >> Also, I’ve updated TlsChannelBinding class to select SHA-256 hash algorithm >> if it can not be derived >> from the certificate signature name. >> >> Regards >> Alexey >> >> >>> On 26 May 2020, at 17:50, Weijun Wang <weijun.w...@oracle.com> wrote: >>> >>> I have a question on GssKrb5Client.java: >>> >>> Do you think it's a good idea to let the SASL mechanism understand what TLS >>> binding is? Instead of passing the whole TlsChannelBinding object through a >>> SASL property, is it possible to only pass the actual cbData? After all, >>> the name "com.sun.security.sasl.channelbinding" suggests it's just a >>> general ChannelBinding which is independent with any application level info. >>> >>> From my reading of the code change, it looks like this cbData can be >>> calculated on the LDAP side. >>> >>> Thanks, >>> Max >>> >>>> On May 21, 2020, at 3:35 PM, Alexey Bakhtin <ale...@azul.com> wrote: >>>> >>>> Hello, >>>> >>>> Could you please review the following patch: >>>> >>>> JBS: https://bugs.openjdk.java.net/browse/JDK-8245527 >>>> Webrev: http://cr.openjdk.java.net/~abakhtin/8245527/webrev.v0/ >>>> >>>> The Windows LDAP server with LdapEnforceChannelBinding=2 uses the >>>> tls-server-end-point channel binding >>>> (based on the TLS server certificate). The channel binding data is >>>> calculated as following : >>>> • The client calculates a hash of the TLS server certificate. >>>> The hash algorithm is selected on the base of the certificate >>>> signature algorithm. >>>> Also, the client should use SHA-256 algorithm, in case of the >>>> certificate signature algorithm is SHA1 or MD5 based >>>> • The channel binding information is the same as defined in rfc4121 [1] >>>> with small corrections: >>>> • initiator and acceptor addresses should be set to NULL >>>> • initiator and acceptor address types should be zero. >>>> It contradicts to the “Using Channel Bindings in GSS-API” >>>> document [2] that say that >>>> the address type should be set to GSS_C_AF_NULLADDR=0xFF, >>>> instead of GSS_C_AF_UNSPEC=0x00. >>>> >>>> This patch introduces changes in the LDAP, SASL and JGSS modules >>>> to generate channel binding data automatically if requested by an >>>> application. >>>> This patch reuses existing org.ietf.jgss.ChannelBinding class >>>> implementation but changes >>>> initial unspecified address type from CHANNEL_BINDING_AF_NULL_ADDR to >>>> CHANNEL_BINDING_AF_UNSPEC. >>>> The patch introduces new environment property >>>> “com.sun.jndi.ldap.tls.cbtype” that indicates >>>> Channel Binding type that should be used in the LDAPS connection over >>>> JGSS/Kerberos. >>>> Right now "tls-server-end-point" Channel Binding type is supported only. >>>> The client extracts server certificate from the underlying TLS connection >>>> and creates >>>> Channel Binding data for JGSS/Kerberos authentication if application >>>> indicates >>>> com.sun.jndi.ldap.tls.cbtype=tls-server-end-point property. >>>> Client application should also specify existing >>>> "com.sun.jndi.ldap.connect.timeout” property >>>> to force and wait TLS handshake completion before JGSS/Kerberos >>>> authentication data is generated. >>>> >>>> [1] - https://tools.ietf.org/html/rfc4121#section-4.1.1.2 >>>> >>>> [2] - >>>> https://docs.oracle.com/cd/E19120-01/open.solaris/819-2145/overview-52/index.html >>>> >>>> Initial discussion of this issue is available at security-dev list: >>>> https://mail.openjdk.java.net/pipermail/security-dev/2019-December/021052.html >>>> https://mail.openjdk.java.net/pipermail/security-dev/2020-January/021140.html >>>> https://mail.openjdk.java.net/pipermail/security-dev/2020-February/021278.html >>>> https://mail.openjdk.java.net/pipermail/security-dev/2020-May/021864.html >>