Kerberos数据库找不到服务器:'DC=mydomain,DC=com'剩余名称含义咨询
修改server.xml中的LDAP服务器地址时遇到以下错误:
GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7))]]; remaining name 'DC=mydomain,DC=com'
具体操作:将server.xml中的地址从xyz.mydomain.com改为ldap.mydomain.com,已在/etc/hosts中添加该域名对应的IP地址,ldap子域名指向xyz子域名(实际LDAP服务器地址为xyz.mydomain.com)。目前通过GUI可连接ldap.mydomain.com,但Apache服务器无法连接,部分错误仅显示“Kerberos数据库中找不到服务器”,无剩余名称信息。
疑问:错误信息中的**remaining name 'DC=mydomain,DC=com'**是什么含义?
附错误堆栈:
GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7))]]; remaining name 'DC=mydomain,DC=com'
Caused by: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Fail to create credential. (63) - No service creds)] at jdk.security.jgss/com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:222) at java.naming/com.sun.jndi.ldap.sasl.LdapSasl.saslBind(LdapSasl.java:172) ... 38 more Caused by: GSSException: No valid credentials provided (Mechanism level: Fail to create credential. (63) - No service creds) at java.security.jgss/sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:773) at java.security.jgss/sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:266) at java.security.jgss/sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:196) at jdk.security.jgss/com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:203) ... 39 more Caused by: KrbException: Fail to create credential. (63) - No service creds at java.security.jgss/sun.security.krb5.internal.CredentialsUtil.serviceCredsSingle(CredentialsUtil.java:458) at java.security.jgss/sun.security.krb5.internal.CredentialsUtil.serviceCreds(CredentialsUtil.java:340) at java.security.jgss/sun.security.krb5.internal.CredentialsUtil.serviceCreds(CredentialsUtil.java:314) at java.security.jgss/sun.security.krb5.internal.CredentialsUtil.acquireServiceCreds(CredentialsUtil.java:169) at java.security.jgss/sun.security.krb5.Credentials.acquireServiceCreds(Credentials.java:490) at java.security.jgss/sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:697)
1. remaining name 'DC=mydomain,DC=com'的含义
这个字段是Java LDAP客户端(JDNI)在Kerberos/GSSAPI认证失败时返回的未完成解析的LDAP命名上下文。简单来说,客户端尝试通过Kerberos认证绑定到LDAP服务器,但认证过程提前失败,此时客户端还没完成对完整LDAP命名空间的解析,就把当前已识别到的根域信息(DC=mydomain,DC=com)作为"剩余名称"返回出来。它本身不是错误原因,只是认证失败时附带的上下文信息。
2. 核心错误根源
你遇到的核心问题是Kerberos认证失败,日志里的"Server not found in Kerberos database"和"No service creds"是关键:
- 当LDAP地址改为
ldap.mydomain.com后,Java客户端会向Kerberos请求ldap/ldap.mydomain.com的服务票据,但你的Kerberos数据库里只有对应原地址xyz.mydomain.com的服务主体(ldap/xyz.mydomain.com),因此找不到匹配的服务器条目。 - GUI能连接是因为GUI工具未使用Kerberos认证,或采用了简单绑定(simple bind),而Apache服务器配置的是Kerberos/GSSAPI绑定,所以出现认证失败。
3. 解决建议
- 添加Kerberos服务主体别名:在Kerberos KDC服务器上,为原LDAP服务主体
ldap/xyz.mydomain.com添加别名ldap/ldap.mydomain.com,更新服务票据后重新导出到Apache服务器的keytab文件中。 - 修改Kerberos配置:若无法修改KDC,可在Apache服务器的
krb5.conf中添加映射规则,将ldap/ldap.mydomain.com映射到ldap/xyz.mydomain.com。 - 检查server.xml配置:确保server.xml中除LDAP地址外,Kerberos相关配置(如服务主体名称)同步更新,或明确指定服务主体为
ldap/xyz.mydomain.com。
内容的提问来源于stack exchange,提问作者Suat Coskun

