使用 GSSAPI 连接到 ldap。错误的服务主体
Connecting to ldap using GSSAPI. Wrong service principal
我正在尝试使用 SASL 连接到 ldap 服务器。我正在使用 url ldaps://ldap.example.com
进行连接,但服务器主机名是 host.example.com
。 ldap.example.com
是 host.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 之前处理。
还有一些建议:
- 所有 SPN 都应在您的 KDC 中定义:
LDAP/ldap.example.com
LDAP/host.example.com
- 这两个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
- jaas.config 中的主体和密钥表 应该 匹配。你有:
principal="ldap@EXAMPLE.COM"
我建议应该是:principal=“ldap/host.example.com“;
- 最后,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。
我正在尝试使用 SASL 连接到 ldap 服务器。我正在使用 url ldaps://ldap.example.com
进行连接,但服务器主机名是 host.example.com
。 ldap.example.com
是 host.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 之前处理。
还有一些建议:
- 所有 SPN 都应在您的 KDC 中定义:
LDAP/ldap.example.com
LDAP/host.example.com
- 这两个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
- jaas.config 中的主体和密钥表 应该 匹配。你有:
principal="ldap@EXAMPLE.COM"
我建议应该是:principal=“ldap/host.example.com“;
- 最后,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。