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

Connecting to ldap using GSSAPI. Wrong service principal

我正在尝试使用 SASL 连接到 ldap 服务器。我正在使用 url 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
    ;
};

有什么办法可以改变这种行为吗?

您应该使用 ldap.example.com 作为主题名称并使用 host.example.com 作为主题备用名称来申请新证书。证书协商在 Kerberos 之前处理。

还有一些建议:

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

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:

ldap.example.com

host.example.com

  1. jaas.config 中的主体和密钥表 应该 匹配。你有:

principal="ldap@EXAMPLE.COM"

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

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

进一步阅读 GSSAPI