具有spring安全性的LDap GSSContext null srcName

Zah*_*kan 8 java spring kerberos spring-security spring-boot

我们尝试使用Spring安全性进行Windows身份验证.

当我们看到我们无法使用为本地PC创建的keytab文件对我们的域用户进行身份验证时,我们检查了我们的服务用户并查看其密码是否有效.然后我们检查了我们是否可以从本地到达AD域.当我们在AD域服务器机器上使用网络监控工具控制时,我们的本地没有请求.我们还使用以下命令检查了来自客户端的传出流量;

netstat -oan 1 | find /I "[IP_ADDRESS_OF_AD_DOMAIN]"
Run Code Online (Sandbox Code Playgroud)

我们可以通过telnet测试我们当地的IP.

我们的application.properties如下所示;

app.ad-domain= example.com
app.ad-server= ldap://adds.example.com.tr/
app.service-principal= HTTP/local_pc.example.com.tr@EXAMPLE.COM.TR
app.keytab-location= local_pc.keytab
app.ldap-search-base= OU=All Users,DC=example,DC=com
app.ldap-search-filter= "(| (userPrincipalName={0}) (sAMAccountName={0}))"
Run Code Online (Sandbox Code Playgroud)

结果我们无法获得GSSContext的srcName.此gssName变量等于null.相关的SunJaasKerberosTicketValidator代码块如下;

@Override
public KerberosTicketValidation run() throws Exception {
    byte[] responseToken = new byte[0];
    GSSName gssName = null;
    GSSContext context = GSSManager.getInstance().createContext((GSSCredential) null);
    boolean first = true;
    while (!context.isEstablished()) {
        if (first) {
            kerberosTicket = tweakJdkRegression(kerberosTicket);
        }
        responseToken = context.acceptSecContext(kerberosTicket, 0, kerberosTicket.length);
        gssName = context.getSrcName();
        if (gssName == null) {
            throw new BadCredentialsException("GSSContext name of the context initiator is null");
        }
        first = false;
    }
    if (!holdOnToGSSContext) {
        context.dispose();
    }
    return new KerberosTicketValidation(gssName.toString(), servicePrincipal, responseToken, context);
}
Run Code Online (Sandbox Code Playgroud)

当我们使用null SrcName错误搜索此GSSContext时,通常建议的解决方案与keytab文件相关.但在我们的问题中,我们甚至无法像我们在开头提到的那样到达AD服务器.

相关链接:带有SrcName的GSSContext

还有其他建议吗?

谢谢...