有没有一种方法可以连接ldaps并忽略java中的证书



我在tomcat上有一个带有ldap的应用程序java,我可以毫无问题地进行身份验证。现在,我的公司想在ldap上插入ssl层,所以我需要使用ldaps。有没有建议忽略ldaps服务器的证书和信任证书?

这是我为ldap 工作的代码

final String ldapAdServer = "ldap://my_ldap_url:3268";
final String ldapSearchBase = "Ldap_search_base";
//need a default user to be able to do query on AD
final String ldapUsername = "username_path_AD";
final String ldapPassword = "password_path_AD";

Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.SECURITY_AUTHENTICATION, "simple");
if(ldapUsername != null) {
env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
}
if(ldapPassword != null) {
env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
}
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapAdServer);
//ensures that objectSID attribute values
//will be returned as a byte[] instead of a String
env.put("java.naming.ldap.attributes.binary", "objectSID");
LdapContext ctx = new InitialLdapContext(env,null);
return ctx;

现在,我尝试创建这个类来信任所有证书:

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class SSLFix {

public static void execute(){
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {}

@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {}
}
};
SSLContext sc=null;
try {
sc = SSLContext.getInstance("SSL");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
sc.init(null, trustAllCerts, new java.security.SecureRandom());
} catch (KeyManagementException e) {
e.printStackTrace();
}
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// Create all-trusting host name verifier
HostnameVerifier validHosts = new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
};
// All hosts will be valid
HttpsURLConnection.setDefaultHostnameVerifier(validHosts);
}
}

因此,我决定用以下代码更改以前的ldap代码:

public LdapContext getLDAPContext() throws NamingException
{
SSLFix.execute();


final String ldapAdServer = "ldaps://my_ldap_url:3269";
final String ldapSearchBase = "ldap_search_base";

//need a default user to be able to do query on AD
final String ldapUsername = "username_path_AD";
final String ldapPassword = "password_path_AD";


Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.SECURITY_AUTHENTICATION, "simple");
if(ldapUsername != null) {
env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
}
if(ldapPassword != null) {
env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
}
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapAdServer);
//ensures that objectSID attribute values
//will be returned as a byte[] instead of a String
env.put("java.naming.ldap.attributes.binary", "objectSID");

LdapContext ctx = new InitialLdapContext(env,null);

return ctx;
}

但是当我执行ldaps的控制时,我得到了这个错误:

javax.naming.CommunicationException:简单绑定失败:[根异常为javax.net.ssl.ssl握手异常:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.scurity.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效证书路径]

您必须导入;LDAP-CA证书";进入Java虚拟机
要执行此操作,您可以运行:
keytool-import-trustcacherts-keystore$JAVA_HOME/jre/lib/security/cacerts-storepass-changeit-alias ldap CA-import-file ldap CA crt.pem

如果你的证书是好的。您的所有客户端(网络浏览器或移动SO(使用您的应用程序都不会有问题。

不要忘记导入您的中间证书或链接证书。(这些证书通常与LDAP-CA证书一起提供(

您可以创建自定义X509CrustManager或SSLSocketFactory。

在中找到了两者的示例https://stackoverflow.com/a/4615497/88122

感谢大家的回复。我决定创建X509CrustManager和SSLSocketFactory,以便允许所有证书。我用这种方式解决了我的问题

我不知道您的环境,但您能将发布LDAP证书的CA证书添加到系统的受信任CA中吗?

这样,你就增强了应用程序的安全性,否则使用LDAP几乎毫无用处。

我假设域控制器安装了CA服务器,LDAP的证书由它发布。下载此证书并将其添加到您的环境中。

如果该应用程序安装在域的计算机上,则可以共享CA证书并抛出组策略规则。您可以查看Microsoft文档。域中的每个证书都必须由受信任的CA发布。

如果您不能接受此证书,请使用此答案中的选项2。