कुछ मार्गदर्शन की आवश्यकता है।जावा वेबस्टार्ट ट्रस्टस्टोर एसएसएल
मेरे पास जावा वेबस्टार्ट ऐप है और मैं इसे SSL.just के माध्यम से किसी सर्वर से कनेक्ट करना चाहता हूं जैसे: System.setProperty ("javax.net.ssl.trustStore", "my.keystore"); लेकिन सर्वर से डाउनलोड किया गया एक JAWS प्रोग्राम काम नहीं करता है और स्थानीय फ़ाइल सिस्टम पर my.keystore नहीं है। तो प्रमाण पत्र को सभी ग्राहकों को वितरित करने का फैसला किया। मैंने निम्नलिखित किया और यह काम किया।
- इस ट्रस्ट स्टोर को स्ट्रीम के रूप में पढ़ें (getResourceAsStream विधि का उपयोग करें)।
- क्लाइंट मशीन (somemp)
- कॉल सिस्टम.सेटप्रॉपर्टी ("javax.net.ssl.trustStore", ट्रस्टस्टोरपाथ) पर किसी भी फ़ाइल में इसे सहेजें;
लेकिन मुझे यकीन है कि इससे बेहतर समाधान होना चाहिए .. किसी भी विचार को बेहतर बनाने के लिए?
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 आपके धैर्य की सराहना, जानने की कोशिश कर जब मैं कुछ समय पाएं मैंने अपना खुद का कस्टमएसएसएलएसकेट फैक्ट्री लिखना शुरू कर दिया..ठीक है अब मैं सुरक्षा को छोड़ रहा हूं ... प्लैटिनम समाधानों के उदाहरण के आधार पर। अगर मैं ऐसा करता हूं ... क्या जानकारी नेटवर्क पर एक स्पष्ट पाठ के रूप में पास होगी?
अब मुझे आश्चर्य है कि ट्रस्टस्टोर फ़ाइल के साथ मुझे क्या करना चाहिए जिसमें मुझे "sometruststore.jks" फ़ाइल है। मुझे इसके साथ क्या करना चाहिए .. क्या मेरे पास अपना खुद का कस्टम ट्रस्टमैनगर सॉफ्टवेयर है? कृपया मुझे सही दिशा में मार्गदर्शन करें।
-padur
जानकारी स्पष्ट टेक्स्ट नहीं होगी। यह एन्क्रिप्ट किया जाएगा, लेकिन प्रमाणीकृत नहीं है क्योंकि यह कोड सभी प्रमाण पत्रों पर भरोसा करने पर विचार करता है। आपको .jks फ़ाइल को संभालने के लिए अपना स्वयं का ट्रस्टमैनर लिखना नहीं है। नीचे दिए गए मेरे उत्तर पर एक नज़र डालें और देखें कि आप एक KeyStore इंस्टेंस को SSLSocketFactory सबक्लास में पास कर सकते हैं। क्लासपाथ से बाहर होने पर आप उस उदाहरण को उसी तरह प्राप्त कर सकते हैं जैसे आप अपने मूल कोड में हैं। – laz