使用GSSAPI连接到ldap。错误的服务主体

时间:2017-02-18 16:53:24

标签: java ldap kerberos jaas gssapi

我正在尝试使用SASL连接到ldap服务器。我正在使用网址ldaps://ldap.example.com进行连接,但服务器主机名为host.example.comldap.example.comhost.example.com的cname。我的程序正在尝试获取ldap/ldap.example.com的服务票证,而不是执行反向DNS请求并获取ldap/host.example.com的票证。当我使用ldap://host.example.com时,一切正常,但我更喜欢使用服务CNAME。

我的代码用于创建连接工厂:

public DefaultConnectionFactory connectionFactory(){
    return new DefaultConnectionFactory(connectionConfig());
}

private ConnectionConfig connectionConfig(){
    final SaslConfig saslConfig = new SaslConfig();
    saslConfig.setMechanism(Mechanism.GSSAPI);

    final BindConnectionInitializer connectionInitializer = new BindConnectionInitializer();
    connectionInitializer.setBindSaslConfig(saslConfig);

    ConnectionConfig connConfig = new ConnectionConfig("ldaps://ldap.example.com");
    connConfig.setConnectionInitializer(connectionInitializer);
    return connConfig;
}

和jaas.config:

com.sun.security.jgss.initiate {
  com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    keyTab="/etc/ldap.keytab"
    principal="ldap@EXAMPLE.COM"
    storeKey=true
    useKeyTab=true
    debug=true
    ;
};

有没有办法改变这种行为?

1 个答案:

答案 0 :(得分:1)

您应该申请一个新的证书,其中ldap.example.com为主题名称,并以host.example.com作为主题替代名称。证书协商在Kerberos之前处理。

还有一些建议:

  1. 应在您的KDC中定义所有SPN:
  2.   

    LDAP / ldap.example.com

         

    LDAP / host.example.com

    1. 这两条A记录都应该在DNS中设置。 Avoid use of CNAMES, while it might be OK at any given time, different browser versions and future updates could cause inconsistent behavior
    2.   

      ldap.example.com

           

      host.example.com

      1. jaas.config中的主体和keytab 匹配。你有:
      2. principal="ldap@EXAMPLE.COM"

        我建议应该是:principal=“ldap/host.example.com“;

        1. 最后,应将ldap / host.example.com定义为keytab中的SPN。如果不是,则可能没问题,只要您(1)将其添加为密钥表中的其他SPN:How do you add multiple SPNs to the same keytab file for Spnego or Kerberos Configuration?或(2)如果您使用的是Active Directory,请参阅Setspn并且您的应用程序服务器支持它。
        2. 请参阅GSSAPI的进一步阅读。