2013-03-04 3 views
8

मेरे पास जावा कीस्टोर में दो प्रमाणपत्र/कुंजी जोड़े हैं। उन महत्वपूर्ण प्रविष्टियों के उपनाम "foo" और "bar" हैं।कनेक्ट करने से पहले मैं SSLSocket में वांछित कुंजी-प्रविष्टि के उपनाम कैसे बता सकता हूं?

मेरा टीएलएस क्लाइंट (जावा प्रोग्राम) कीस्टोर का उपयोग करता है। कनेक्शन खोलने के दौरान टीएलएस क्लाइंट प्रमाणीकरण किया जाता है। क्लाइंट प्रोग्राम क्लाइंट से TLS सर्वर अनुरोध प्रमाणपत्र जब "foo" कुंजी-प्रविष्टि का उपयोग करना चाहिए। अब कनेक्शन कनेक्शन हैंडशेक के दौरान सर्वर को गलत प्रमाणपत्र ("बार") भेजता है।

कनेक्ट करने से पहले मैं SSLSocket में वांछित कुंजी-प्रविष्टि के उपनाम कैसे बता सकता हूं?

वर्तमान कोड पीछा कर रहा है:

final SSLSocket ss = (SSLSocket)SSLSocketFactory.getDefault().createSocket(); 
ss.setEnabledProtocols(new String[] {"TLSv1"}); 
ss.connect(targetAddress); 
+0

के लिए 'बार' प्रविष्टि क्या है? आपके पास दो क्लाइंट प्रमाणपत्र क्यों हैं? – EJP

+0

@EJP: क्लाइंट प्रोग्राम एक परीक्षण कार्यक्रम है। विभिन्न प्रकार के उपयोग मामलों के परीक्षण के लिए कई महत्वपूर्ण प्रविष्टियों की आवश्यकता होती है। – SKi

उत्तर

13

डिफ़ॉल्ट KeyManager पहले प्रमाण पत्र यह है कि स्थिति सर्वर द्वारा अनुरोध से मेल खाता है पाता है, भेज देंगे कि है, यह पहले एक यह है जिसके लिए लगता है भेज देंगे यह अनुरोध के दौरान सर्वर द्वारा भेजे गए सीए नामों में से एक को प्रमाणीकरण श्रृंखला बना सकते हैं।

यदि आप हमेशा एक विशिष्ट उपनाम चुनना चाहते हैं, तो आपको संभवतः डिफ़ॉल्ट प्रबंधक को लपेटने के लिए अपने X509KeyManager को लागू करने की आवश्यकता होगी। इन पंक्तियों के साथ कुछ काम करना चाहिए (इस वास्तविक कोड का परीक्षण नहीं किया, कुछ लिखने की त्रुटियों हो सकता है):

KeyStore keystore = ... // create and load your keystore. 

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
kmf.init(keystore, password.toCharArray()); 

final X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0]; 

X509KeyManager km = new X509KeyManager() { 
    public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) { 
     return "foo"; 
    } 

    public X509Certificate[] getCertificateChain(String alias) { 
     return origKm.getCertificateChain(alias); 
    } 

    // Delegate the rest of the methods from origKm too... 
} 

तब के लिए उपयोग अपने SSLContext:

SSLContext sslContext = sslContext.getInstance("TLS"); 
sslContext.init(new KeyManager[] { km }, null, null); 
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 
+0

यह वादा करने जैसा लगता है। मैं आज कोशिश करूँगा। – SKi

+0

@ उपयोगकर्ता 1: क्या आप इसे लागू करने के लिए पूरा कोड पोस्ट कर सकते हैं? – rkkreddy

संबंधित मुद्दे

 संबंधित मुद्दे