我正在尝试分析 Ldap 搜索期间异常/失败的原因。我在 Active Directory 域控制器上使用 JNDI 执行操作。
这是我正在尝试做的事情的背景:
- 使用 SASL(
Kerberos authentication
) 使用 JAAS(KRB5LoginModule
) 生成一个LoginContext
. - 登录成功后,
LoginContext
实例具有经过身份验证的主题,其中TGT
填充了 kerberos 票证 ()PrivateCredentials
- 之后,我使用 GSSAPI 使用上面的 authenticated 生成 LdapContext
Subject
。 LdapContext
生成后,我用它来执行 JNDI 操作(主要使用分页搜索)
- 到现在一切都很好,并且 LdapContext 已正确生成
- Active Directory 域控制器设置的一些详细信息:
- TGT 的生命周期设置为
1 hour
- 服务票证( )的生命周期
TGS
设置为 10 分钟(由于某些限制而需要,但实际上是这样的)
现在的场景:
使用
LdapContext
上面创建的,它开始使用 查询域控制器,pagingcontrol
并且事情在一定的时间或一定的搜索量内工作顺利(这样说是为了我不希望你们都误导这实际上可能涉及时间,只需考虑这发生在(大约)定期间隔之后 - 这些间隔可能是时间或搜索当它在一定间隔后获取下一页时,搜索失败并显示:
Caused by: javax.naming.CommunicationException: Connection reset at com.sun.jndi.ldap.LdapCtx.getSearchReply(LdapCtx.java:1920) ~[?:1.8.0_73] at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.getNextBatch(AbstractLdapNamingEnumeration.java:130) ~[?:1.8.0_73] at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMoreImpl(AbstractLdapNamingEnumeration.java:217) ~[?:1.8.0_73] at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMore(AbstractLdapNamingEnumeration.java:189) ~[?:1.8.0_73] ... 10 more Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:209) ~[?:1.8.0_73] at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_73] at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) ~[?:1.8.0_73] at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) ~[?:1.8.0_73] at java.io.BufferedInputStream.read(BufferedInputStream.java:345) ~[?:1.8.0_73] at com.sun.jndi.ldap.sasl.SaslInputStream.readFully(SaslInputStream.java:166) ~[?:1.8.0_73] at com.sun.jndi.ldap.sasl.SaslInputStream.fill(SaslInputStream.java:123) ~[?:1.8.0_73] at com.sun.jndi.ldap.sasl.SaslInputStream.read(SaslInputStream.java:90) ~[?:1.8.0_73] at com.sun.jndi.ldap.Connection.run(Connection.java:860) ~[?:1.8.0_73] at java.lang.Thread.run(Thread.java:745) ~[?:1.8.0_73]
同时,我在 Active Directory 域控制器上看到以下事件日志:EventId:2889
Log Name: Directory Service
Source: Microsoft-Windows-ActiveDirectory_DomainService
Event ID: 2889
Task Category: LDAP Interface
Level: Information
Keywords: Classic
User: ANONYMOUS LOGON
Computer: myad01.example.lab
Description:The following client performed a SASL (Negotiate/Kerberos/NTLM/Digest) LDAP bind without
requesting signing (integrity verification), or performed a simple bind over a clear text (non-
SSL/TLS-encrypted) LDAP connection.
Client IP address: X.X.X.X:56260
Identity the client attempted to authenticate as:EXAMPLE\Administrator
Binding Type:0
我还看到了一个EventID为1216的日志。详细信息如下:
Log Name: Directory Service
Source: Microsoft-Windows-ActiveDirectory_DomainService
Event ID: 1216
Task Category: LDAP Interface
Level: Warning
Keywords: Classic
User: N/A
Computer: myad01.example.lab
Description:Internal event: An LDAP client connection was closed because of an error.
Client IP:X.X.X.X:56244
Additional Data
Error value: 1236 The network connection was aborted by the local system.
Internal ID: c060420
我的理解:每当(在一段时间后)它去获取下一页时ldap connection
,服务器(如事件 id 所建议的那样1216
)将其无效,因此我得到了CommunicationException
. 我的问题是为什么我会在一段时间后而不是立即得到这个?是因为 kerberos 和服务票证的有效期已经结束了吗?
如果是这种情况,那么我应该如何设计来克服分页问题?因为,在收到通信异常后,如果我创建一个新的 LdapContext 并设置分页控件,我会按预期得到以下异常:
javax.naming.OperationNotSupportedException: [LDAP: error code 12 - 00000057: LdapErr: DSID-0C090B0B, comment: Error processing control, data 0, v3839 ]
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(Unknown Source) ~[?:1.8.0_201]
at com.sun.jndi.ldap.LdapCtx.processReturnCode(Unknown Source) ~[?:1.8.0_201]
at com.sun.jndi.ldap.LdapCtx.processReturnCode(Unknown Source) ~[?:1.8.0_201]
at com.sun.jndi.ldap.LdapCtx.searchAux(Unknown Source) ~[?:1.8.0_201]
at com.sun.jndi.ldap.LdapCtx.c_search(Unknown Source) ~[?:1.8.0_201]
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(Unknown Source) ~[?:1.8.0_201]
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source) ~[?:1.8.0_201]
at javax.naming.directory.InitialDirContext.search(Unknown Source) ~[?:1.8.0_201]
对我来说,同时支持身份验证的 SASL(kerberos) 和创建 LdapContext 的 GSSAPI 对我来说非常重要。此外,分页很重要,因为数据量很大,而且我们不能对票证的有效性进行任何限制,因为我无法控制客户的环境!
请为我提供有关如何进一步调试此问题的指示,并提出正确的方法或解决方法(对此感到抱歉,但无论如何都需要它)来解决此问题。