验证AD域登陆

这里只说一下具体操作,关于域之类的知识,请百度或者谷歌。
一般分为两种,一种是没有证书验证,另一种是证书验证(SSL方式)
第一种:
/* connect to ldap /
public LdapContext connectLDAP(String userName,String password) {
// String userName = “Administrator”;//UserName
// String password = “Test123456”;//PassWord
String host = “”;//AD IP
String domain = “”;//Domain suffix
String port = “389”; //port 389
String url = new String(“ldap://” + host + “:” + port);//Fixed writing
String user = userName + domain;
Hashtable env = new Hashtable();
LdapContext ctx = null;
env.put(Context.SECURITY_AUTHENTICATION, “simple”);//LDAP Access security level(none,simple,strong)
env.put(Context.SECURITY_PRINCIPAL, user); //userName
env.put(Context.SECURITY_CREDENTIALS, password);//password
env.put(Context.INITIAL_CONTEXT_FACTORY,
“com.sun.jndi.ldap.LdapCtxFactory”);// LDAP Factory
env.put(Context.PROVIDER_URL, url);//Url
try {
ctx = new InitialLdapContext(env,null);// init
System.out.println(“Authentication success!”);
} catch (AuthenticationException e) {
System.out.println(“Authentication failure!”);
e.printStackTrace();
} catch (javax.naming.CommunicationException e) {
System.out.println(“AD Domain connection failure!”);
e.printStackTrace();
} catch (Exception e) {
System.out.println(“Unidentified authentication exception!”);
e.printStackTrace();
}
return ctx;
}
第二种:
可以分为两种:
2.1 有一种方法可以避开证书。(来自于某篇博客,但是我现在找不到了,感谢那位博主!)
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class DummyTrustManager implements X509TrustManager{
public void checkClientTrusted( X509Certificate[] cert, String authType) {
return;
}
public void checkServerTrusted( X509Certificate[] cert, String authType) {
return;
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;

public class DummySSLSocketFactory extends SSLSocketFactory{
private SSLSocketFactory factory;

public DummySSLSocketFactory() {
try {
SSLContext sslcontext = SSLContext.getInstance(“TLS”);
sslcontext.init( null, // No KeyManager required
new TrustManager[] { new DummyTrustManager()},
new java.security.SecureRandom());
factory = ( SSLSocketFactory) sslcontext.getSocketFactory();
} catch( Exception ex) { ex.printStackTrace(); }
}
public static SocketFactory getDefault() {
return new DummySSLSocketFactory();
}
public Socket createSocket( Socket socket, String s, int i, boolean flag) throws IOException {
return factory.createSocket( socket, s, i, flag);
}
public Socket createSocket( InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException {
return factory.createSocket( inaddr, i, inaddr1, j);
}
public Socket createSocket( InetAddress inaddr, int i) throws IOException {
return factory.createSocket( inaddr, i);
}
public Socket createSocket( String s, int i, InetAddress inaddr, int j) throws IOException {
return factory.createSocket( s, i, inaddr, j);
}
public Socket createSocket( String s, int i) throws IOException {
return factory.createSocket( s, i);
}
public String[] getDefaultCipherSuites() {
return factory.getSupportedCipherSuites();
}
public String[] getSupportedCipherSuites() {
return factory.getSupportedCipherSuites();
}

/* connect to ldap /
@SuppressWarnings(“unused”)
private boolean connectLDAPSuccesOrNot(String userName,String password,String host,String domain,String port,String keyStore,String sslPassWord) {
boolean flag = false;
// String userName = “Administrator”;//UserName
// String password = “Test123456”;//PassWord
// String host = “”;//AD IP
// String domain = “”;//Domain suffix
// String port = “636”; //port 636
String url = new String(“ldap://” + host + “:” + port);//Fixed writing
String[] strDomain = null;
StringBuffer sb = new StringBuffer();
if(!StringHelper.isEmpty(domain)){
strDomain = domain.split(“\.”);
}
if(strDomain!=null){
for(int i=0;i < strDomain.length;i++){
sb.append(“,dc=”+strDomain[i]);
}
}
String user = userName+”@”+domain ;
Properties env = new Properties();
if (“636”.equals(port)) {
System.setProperty(“javax.net.ssl.trustStore”, keyStore);
System.setProperty(“javax.net.ssl.trustStorePassword”, sslPassWord);
env.put(Context.SECURITY_PROTOCOL, “ssl”);
env.put(“java.naming.ldap.factory.socket”, “包名.DummySSLSocketFactory”);
}
LdapContext ctx = null;
env.put(Context.SECURITY_AUTHENTICATION, “simple”);//LDAP Access security level(none,simple,strong)
env.put(Context.SECURITY_PRINCIPAL, user); //userName
env.put(Context.SECURITY_CREDENTIALS, password);//password
env.put(Context.INITIAL_CONTEXT_FACTORY,
“com.sun.jndi.ldap.LdapCtxFactory”);// LDAP Factory
env.put(Context.PROVIDER_URL, url);//Url
// env.put(“com.sun.jndi.ldap.connect.pool”, “true”);
// env.put(“java.naming.referral”, “follow”);
try {
ctx = new InitialLdapContext(env,null);// init
System.out.println(“Authentication success!”);
flag = true;
} catch (AuthenticationException e) {
System.out.println(“Authentication failure!”);
e.printStackTrace();
} catch (javax.naming.CommunicationException e) {
System.out.println(“AD Domain connection failure!”);
e.printStackTrace();
} catch (Exception e) {
System.out.println(“Unidentified authentication exception!”);
e.printStackTrace();
} finally{
return flag;
}
}
2.2 需要证书
2.2.1 安装域控制器,没什么难度,百度或者谷歌
2.2.2 AD域控安装证书服务
2.2.3 从ad域上拿ca证书文件
http://ad域服务器IP/certsrv/
2.2.4 去域控服务器上拿crt文件
C:\Windows\System32\certsrv\CertEnroll
2.2.5 安装cer或者crt文件到environment variables的JAVA_HOME path的\jre\lib\security文件夹
重要
2.2.6 执行 命令:
cd environment variables的JAVA_HOME path的\jre\lib\security文件夹
keytool -import -keystore “c:/testca.keystore” -file “changeit.crt” -storepass “changeit”
keytool -import -keystore “c:/testca.keystore” -alias mkey -file “changeit.cer” -storepass “changeit”
出现 Trusted this certificate? 按 “y” 即新增成功.
System.setProperty(“javax.net.ssl.trustStore”, keyStore);
System.setProperty(“javax.net.ssl.trustStorePassword”, sslPassWord);
关于代码百度很多,自己找吧。
吐槽以下,编辑器真难用。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值