首先非常感谢義拾壹的耐心指导
困扰我三天的连接问题终于解决!
https://blog.csdn.net/qq_41207282/article/details/97133887#comments
1.报错提示:
javax.naming.CommunicationException: simple bind failed: <IP>:636 [Root exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names matching IP address <IP> found]
2.服务器端导出证书到本地
我的是在虚拟机上运行的,所以是从虚拟机导出再复制到本地。
2.1 win+R,输入mmc,添加证书。
2.2 然后找到以下两个证书。
2.3 将两个文件分别右键->所有任务->导出。
2.4 导出成功后在虚拟机桌面生成两个cer文件。
2.5 复制粘贴至本地环境,我放在了D盘。
3. 导入本地密钥库
将cer文件加入到jdk密钥库中。
keytool -import -keystore D:\Java\jdk1.8.0_211\jre\lib\security\cacerts -storepass changeit -keypass changeit -alias ca -file D:/ca.cer
keytool -import -keystore D:\Java\jdk1.8.0_211\jre\lib\security\cacerts -storepass changeit -keypass changeit -alias ca_1 -file D:/ca_1.cer
4. 修改hosts
进入本地C:\Windows\System32\drivers\etc\hosts修改hosts
添加IP和域名,域名为证书上的域名,这点很关键。
5. 代码编写
public void certinit() {
String keystore = "D:\\Java\\jdk1.8.0_211\\jre\\lib\\security\\cacerts";
System.setProperty("javax.net.ssl.trustStore", keystore);
Properties env = new Properties();
String adminName = "cn=Administrator,cn=Users,dc=hct,dc=com";
String adminPassword = "Admin123456";// password
String ldapURL = "ldaps://WIN-6NQKI1CT5ST.hct.com:636";// ip:port
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "simple");// LDAP访问安全级别:"none","simple","strong"
env.put(Context.SECURITY_PRINCIPAL, adminName);
env.put(Context.SECURITY_CREDENTIALS, adminPassword);
env.put(Context.PROVIDER_URL, ldapURL);
env.put(Context.SECURITY_PROTOCOL, "ssl");
try {
LdapContext lc = new InitialLdapContext(env, null);
System.out.println("AD域ssl身份认证成功");
} catch (Exception e) {
System.out.println("AD域ssl身份认证出错");
e.printStackTrace();
}
}
特别注意:
1.keystore为你的密钥库路径
2.String ldapURL = "ldaps://WIN-6NQKI1CT5ST.hct.com:636";采用ldaps,并且域名为hosts上添加的域名。
6. 结果
终于终于,连接成功了!
说实话,失败的信息我都看腻了!