需要一些指导.
我有java webstart应用程序,我希望它通过SSL连接到服务器.只需添加一个属性,如:System.setProperty("javax.net.ssl.trustStore","my.keystore");但是因为JAWS程序是从服务器下载不起作用,本地文件系统上没有my.keystore.所以决定将证书分发给所有客户.我做了以下工作.
将此信任存储读取为流(使用getResourceAsStream方法).
将其保存在客户端计算机上的任何文件中(sometemp)
调用System.setProperty("javax.net.ssl.trustStore",trustStorePath);
但我相信必须有比这更好的解决方案..任何想法让它变得更好?
public boolean validateUserFromActiveDirectory(String userId) { final String MEMBER_GROUP = "CN=asdadasd,OU=asdasdasd Accounts,OU=adasdas,OU=asdasdas,DC=asdasdas,DC=asdasdas,DC=adasdasd,DC=asdasdasd"; String employeeNumber = ""; final String LDAP_INIT_CTX = "com.sun.jndi.ldap.LdapCtxFactory"; final String LDAP_URL = "ldap://xx-ssssssss.eee.eee.eeeee.eeeee:636"; final String MY_ATTRS[] = { "employeeNumber" }; String adminPassword = "somepassword"; String securityProtocol = "ssl"; boolean isValidUser = false; try { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, LDAP_INIT_CTX); env.put(Context.PROVIDER_URL, LDAP_URL); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.REFERRAL, "follow"); env.put(Context.SECURITY_PRINCIPAL, MEMBER_GROUP); env.put(Context.SECURITY_CREDENTIALS, adminPassword); env.put(Context.SECURITY_PROTOCOL, securityProtocol); //C:\Documents and Settings\yourusername\Local Settings\Temp File tf = File.createTempFile("someTruststore", ".jks"); tf.deleteOnExit(); byte buffer[] = new byte[0x1000]; ClassLoader cl = JNDI.class.getClassLoader(); InputStream in = cl.getResourceAsStream( "someTruststore.jks"); FileOutputStream out = new FileOutputStream(tf); int cnt; while ((cnt = in.read(buffer)) != -1) out.write(buffer, 0, cnt); in.close(); out.close(); System.setProperty("javax.net.ssl.trustStore", tf .getAbsolutePath()); DirContext context = new InitialLdapContext(env, null); SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); NamingEnumeration results = context.search( "XX=ent,XX=abc,XX=aaaaa,XX=aaaa", "(sAMAccountName=" + userId + ")", searchControls); if (results != null && results.hasMore()) { //some logic } } } catch (Exception e) { e.printStackTrace(); } return isValidUser; }
-Padur ===========================**=============
/**
**/
package util; /** * @author spaduri * */ 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 CustomSSLSocketFactory extends SSLSocketFactory { private SSLSocketFactory factory; public CustomSSLSocketFactory() { try { SSLContext sslcontext = null; // Call getKeyManagers to get suitable key managers KeyManager[] kms=getKeyManagers(); if (sslcontext == null) { sslcontext = SSLContext.getInstance("SSL"); sslcontext.init(kms, new TrustManager[] { new CustomTrustManager() }, new java.security.SecureRandom()); } factory = (SSLSocketFactory) sslcontext.getSocketFactory(); } catch (Exception ex) { ex.printStackTrace(); } } public static SocketFactory getDefault() { return new CustomSSLSocketFactory(); } 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(); } protected KeyManager[] getKeyManagers() throws IOException, GeneralSecurityException { // First, get the default KeyManagerFactory. String alg=KeyManagerFactory.getDefaultAlgorithm(); KeyManagerFactory kmFact=KeyManagerFactory.getInstance(alg); // Next, set up the KeyStore to use. We need to load the file into // a KeyStore instance. ClassLoader cl = CustomSSLSocketFactory.class.getClassLoader(); // read the file someTrustStore from the jar file from a classpath InputStream in = cl.getResourceAsStream("ssl/someTruststore.jks"); //FileInputStream fis=new FileInputStream(adentTruststore.jks); KeyStore ks=KeyStore.getInstance("jks"); ks.load(in, null); in.close(); // Now we initialise the KeyManagerFactory with this KeyStore kmFact.init(ks, null); // And now get the KeyManagers KeyManager[] kms=kmFact.getKeyManagers(); return kms; } }
package util; import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; public class CustomTrustManager 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]; } }
Laz感谢您的耐心,在我有空的时候尝试学习.我开始编写我自己的CustomSSLSocketFactory..right现在我绕过了安全性...基于铂金解决方案的例子.如果我这样做......信息会在网络上作为明文传递吗?
现在我想知道我应该怎么处理信任库文件我有"sometruststore.jks"文件.我应该怎么做..我是否有自己的自定义信任管理软件?请指导我正确的方向.
-padur