Java Webstart Truststore SSL

需要一些指导。

我有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 SettingsyourusernameLocal SettingsTemp
                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];
        }
    }
    

    拉兹感谢你的耐心,试图在我学习的时候学习。 我开始写我自己的CustomSSLSocketFactory ..现在我正在绕过安全...基于白金解决方案的例子。如果我这样做......将信息作为网络上的明文传递?

    现在我想知道我应该如何处理“sometruststore.jks”文件的信任库文件。 我应该怎么做..我有我自己的定制信任管理软件吗? 请指导我正确的方向。

    -padur


    你可以做到这一点,而不必依靠系统属性和文件系统。 像你正在做的流一样读密钥库并创建你自己的SSLSocketFactory将会更清晰。

    import java.net.URL;
    import java.security.KeyStore;
    import java.security.SecureRandom;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManagerFactory;
    
    ...
    
        // assume keyStore is the KeyStore you read via getResourceAsStream
        final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
        trustManagerFactory.init(keyStore);
    
        final SSLContext context = SSLContext.getInstance("SSL");
        context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
    
        final URL url = new URL("https://whatever");
        final HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
        urlConnection.setSSLSocketFactory(context.getSocketFactory());
    
    ...
    

    我没有证实,但我没有看到为什么这不应该通过Webstart的原因。

    更新:

    你提到你正在寻找连接到活动目录,所以我猜你会使用LDAPS作为协议? 如果是这样,也许这个URL的代码可以作为灵感? 您必须创建一个javax.net.ssl.SSLSocketFactory的子类(请参阅铂金解决方案链接中的BlindSSLSocketFactoryTest ),它包装创建SSLContext上述逻辑并将调用委托给context.getSocketFactory()创建的SSLSocketFactory

    public class TrustedSSLSocketFactory extends SSLSocketFactory {
        private static SSLContext context;
        public static void initTrustedSSLSocketFactory(final KeyStore keyStore) throws Exception {
            final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
            trustManagerFactory.init(keyStore);
    
            final SSLContext context = SSLContext.getInstance("SSL");
            context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
        }
    
        public static SocketFactory getDefault() {
            return context.getSocketFactory();
        }
    
        public Socket createSocket(String arg0, int arg1) throws IOException, UnknownHostException {
            return trustedFactory.createSocket(arg0, arg1);
        }
    
        public Socket createSocket(InetAddress arg0, int arg1) throws IOException {
            return trustedFactory.createSocket(arg0, arg1);
        }
    
        public Socket createSocket(String arg0, int arg1, InetAddress arg2, int arg3) throws IOException, UnknownHostException {
            return trustedFactory.createSocket(arg0, arg1, arg2, arg3);
        }
    
        public Socket createSocket(InetAddress arg0, int arg1, InetAddress arg2, int arg3) throws IOException {
            return trustedFactory.createSocket(arg0, arg1, arg2, arg3);
        }
    }
    

    希望编译,我目前无法测试它! 还要注意initTrustedSSLSocketFactory throws子句的懒惰。

    然后,当您设置LDAP环境时,请使用

    TrustedSSLSocketFactory.initTrustedSSLSocketFactory(keyStore);
    env.put("java.naming.ldap.factory.socket", TrustedSSLSocketFactory.class.getName())
    

    与铂金解决方案的样本代码类似。 希望这是更多你正在寻找什么?

    链接地址: http://www.djcxy.com/p/903.html

    上一篇: Java Webstart Truststore SSL

    下一篇: resetting non