2012-07-09 11 views
6

कैसे लिखना है मैंने अपने एसएसएल क्लाइंट/सर्वर सिस्टम (कोई HTTP) सेट अप करने के लिए बहुत सी चीजें पढ़ी हैं।नेटटी एसएसएल: ट्रस्टमैनेजर

मैंने खुद को the secure chat example और the websocket ssl server example से प्रेरित किया।

public class SecureChatTrustManagerFactory extends TrustManagerFactorySpi { 

    private static final TrustManager DUMMY_TRUST_MANAGER = new X509TrustManager() { 
     @Override 
     public X509Certificate[] getAcceptedIssuers() { 
      return new X509Certificate[0]; 
     } 

     @Override 
     public void checkClientTrusted(
       X509Certificate[] chain, String authType) throws CertificateException { 
      // Always trust - it is an example. 
      // You should do something in the real world. 
      // You will reach here only if you enabled client certificate auth, 
      // as described in SecureChatSslContextFactory. 
      System.err.println(
        "UNKNOWN CLIENT CERTIFICATE: " + chain[0].getSubjectDN()); 
     } 

     @Override 
     public void checkServerTrusted(
       X509Certificate[] chain, String authType) throws CertificateException { 
      // Always trust - it is an example. 
      // You should do something in the real world. 
      System.err.println(
        "UNKNOWN SERVER CERTIFICATE: " + chain[0].getSubjectDN()); 
     } 
    }; 

    public static TrustManager[] getTrustManagers() { 
     return new TrustManager[] { DUMMY_TRUST_MANAGER }; 
    } 

    @Override 
    protected TrustManager[] engineGetTrustManagers() { 
     return getTrustManagers(); 
    } 

    @Override 
    protected void engineInit(KeyStore keystore) throws KeyStoreException { 
     // Unused 
    } 

    @Override 
    protected void engineInit(ManagerFactoryParameters managerFactoryParameters) 
      throws InvalidAlgorithmParameterException { 
     // Unused 
    } 
} 

कैसे आप इस वर्ग के ठीक से लागू करते हैं: पहले से ही मेरी cert.jks आदेश

keytool -genkey -alias app-keysize 2048 -validity 36500 
-keyalg RSA -dname "CN=app" 
-keypass mysecret-storepass mysecret 
-keystore cert.jks 

साथ फाइल सुरक्षित चैट उदाहरण में वहाँ इस वर्ग है बनाया?

और यह कोड (SecureChatSslContextFactory कक्षा में) में:

SSLContext serverContext = null; 
    SSLContext clientContext = null; 
    try { 
     KeyStore ks = KeyStore.getInstance("JKS"); 
     ks.load(SecureChatKeyStore.asInputStream(), 
       SecureChatKeyStore.getKeyStorePassword()); 

     // Set up key manager factory to use our key store 
     KeyManagerFactory kmf = KeyManagerFactory.getInstance(algorithm); 
     kmf.init(ks, SecureChatKeyStore.getCertificatePassword()); 

     // Initialize the SSLContext to work with our key managers. 
     serverContext = SSLContext.getInstance(PROTOCOL); 
     serverContext.init(kmf.getKeyManagers(), null, null); 
    } catch (Exception e) { 
     throw new Error(
       "Failed to initialize the server-side SSLContext", e); 
    } 

    try { 
     clientContext = SSLContext.getInstance(PROTOCOL); 
     clientContext.init(null, SecureChatTrustManagerFactory.getTrustManagers(), null); 
    } catch (Exception e) { 
     throw new Error(
       "Failed to initialize the client-side SSLContext", e); 
    } 

क्यों वे लाइन serverContext.init(kmf.getKeyManagers(), null, null); में null बजाय tmf.getTrustManagers() रख सकता हूं?

उत्तर

9

आप इस कक्षा को सही ढंग से कैसे कार्यान्वित करते हैं?

आपको यह जांचने के लिए एक तरीका परिभाषित करने की आवश्यकता है कि आप chain[0] पर एक या दूसरे तरीके से प्रमाण पत्र पर भरोसा करते हैं। यदि आप नहीं करते हैं, तो CertificateException फेंक दें। (यहाँ SecureChatTrustManagerFactory कुछ भी फेंकता है कभी नहीं, तो यह सत्यापन, जो कनेक्शन MITM हमलों के लिए खुला कर सकते हैं नजरअंदाज।)

आप अर्द्ध मैन्युअल रूप से सत्यापन करना चाहते हैं, तो आप Java PKI API उपयोग कर सकते हैं, हालांकि it can be a bit tedious, यहां तक ​​कि अपेक्षाकृत सरल उपयोग मामलों पर।

आम तौर पर, सही काम करने के लिए अपने आप को लागू करने के लिए सही बात है। इसे TrustManagerFactory पर छोड़ दें (उसी तरह से कम या कम KeyManagerFactory के साथ किया गया है)। वैसे, दोनों मामलों में, algorithm के मान के लिए Key/TrustManagerFactory.getDefaultAlgorithm() का उपयोग करने की सलाह दूंगा, जब तक कि आपके पास कोई अच्छा कारण न हो। यह SunX509 से कम से कम एक बेहतर डिफ़ॉल्ट मान है जिसे मैंने कई मामलों में हार्ड-कोड किया है (और वास्तव में डिफ़ॉल्ट टीएमएफ एल्गोरिदम मान नहीं है)।

आप अपने स्वयं के ट्रस्टस्टोर से एक टीएमएफ शुरू कर सकते हैं (KeyStore का एक उदाहरण जिसे आप विशेष रूप से इस कनेक्शन के लिए लोड कर सकते हैं, उदाहरण के लिए)।

क्यों वे tmf.getTrustManagers() लाइन serverContext.init (kmf.getKeyManagers(), अशक्त, नल) में के बजाय अशक्त कर दिया करते हैं; ?

विश्वास प्रबंधकों के लिए SecureRandom गिरावट वापस डिफ़ॉल्ट मानों के लिए के लिए null और null। डिफ़ॉल्ट ट्रस्ट स्टोर (javax.net.ssl.trustStore में स्थान का उपयोग करके, या jssecacerts फ़ाइल या cacerts पर वापस गिरने) का उपयोग करके डिफ़ॉल्ट टीएमएफ एल्गोरिदम (आमतौर पर PKIX) के साथ प्रारंभ किया गया एक डिफ़ॉल्ट ट्रस्ट मैनेजर होगा। JSSE reference guide में अधिक जानकारी।

+1

अभी भी कुछ काम करने का प्रबंधन नहीं किया गया है ... मुझे नहीं लगता कि मेरे अपने ट्रस्टमैनेजर को कैसे कार्यान्वित करें फैक्टरी – Nanocom

+1

अपने स्वयं के टीएमएफ को लागू न करें, मौजूदा का उपयोग करें। – Bruno

+0

क्षमा करें, मेरा मतलब है कि मैंने अपने स्वयं के SecureChatSslContextFactory को लागू नहीं किया है – Nanocom