我正在使用 JNDI 通过 ldaps 连接到远程 OpenLDAP 服务器,代码如下:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, connectionType);
env.put(Context.PROVIDER_URL, ldapUrl);
env.put(Context.SECURITY_PRINCIPAL, userDn);
env.put(Context.SECURITY_CREDENTIALS, password);
String truststorePath = "C:\\Software\\OpenSSL-Win64\\CertificateEntityMatching\\truststore.ks";
String keystorePath = "C:\\Software\\OpenSSL-Win64\\CertificateEntityMatching\\keystore.ks";
String keyStorePassword = "123456789";
System.setProperty("javax.net.ssl.trustStore", truststorePath);
System.setProperty("javax.net.ssl.keyStore", keystorePath);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);
try {
InitialLdapContext ldap = new InitialLdapContext(env, null);
System.out.println("Connect to LDAP successfully.");
return ldap;
} catch (AuthenticationException e) {
e.printStackTrace();
return null;
} catch (NamingException e) {
e.printStackTrace();
return null;
}
以下是我在 OpenLDAP 服务器上的 slapd.conf 文件中启用 TLS 的方法:
# Enable TLS
TLSCipherSuite HIGH:MEDIUM:-SSLv2:-SSLv3
TLSVerifyClient demand
TLSCertificateFile /usr/local/etc/openldap/tls/certificate.pem
TLSCertificateKeyFile /usr/local/etc/openldap/tls/key.pem
服务器的 certificate.pem 已添加到我的应用程序的信任库中,因此如果将 TLSVerifyClient 设置为从不,我的应用程序可以成功连接到 LDAP 服务器。问题是当我将 TLSVerifyClient 设置为要求时,LDAP 服务器拒绝连接,因为我的应用程序使用自签名证书:
TLS trace: SSL3 alert write:fatal:unknown CA
TLS trace: SSL_accept:error in error
TLS: can't accept: error:1417C086:SSL routines:tls_process_client_certificate:certificate verify failed (self signed certificate).
5bd922de connection_read(16): TLS accept failure error=-1 id=1001, closing
有人能指导我如何让 OpenLDAP 服务器信任我的应用程序的自签名证书吗?OpenLDAP 服务器是否有类似于“信任库”的东西?提前致谢。
答案1
slapd.conf(5)
TLSCA 证书文件 指定包含 slapd 可识别的所有证书颁发机构的证书的文件。签署服务器证书的 CA 的证书必须包含在这些证书中。
如果签署 CA 不是顶级(根)CA,则应存在从签署 CA 到顶级 CA 的整个 CA 序列的证书。多个证书只需附加到文件即可;顺序并不重要。TLSCA 证书路径 指定包含证书颁发机构证书(位于单独的文件中)的目录的路径。通常只使用此文件或 TLSCACertificateFile 之一。使用 GnuTLS 时不支持此指令。使用
Mozilla NSS 时,可能包含 Mozilla NSS 证书/密钥数据库。如果包含 Mozilla NSS 证书/密钥数据库和 CA 证书文件,OpenLDAP 将使用证书/密钥数据库并忽略 CA 证书文件。