2011-05-17 17 views
28

क्या मानक जावा एसएसएल सॉकेट किसी संपत्ति के साथ एसएसएल कनेक्शन के लिए होस्टनाम सत्यापन को अक्षम करने का कोई तरीका है? अब तक एकमात्र रास्ता मिला है, एक होस्टनाम सत्यापनकर्ता लिखना है जो हर समय सच होता है।जावा एसएसएल: मेजबाननाम सत्यापन को अक्षम कैसे करें

Weblogic, इस संभावना प्रदान करता है यह निम्नलिखित संपत्ति के साथ होस्ट नाम सत्यापन को अक्षम करना संभव है:

-Dweblogic.security.SSL.ignoreHostnameVerify

+1

ठीक है, आपका बहुत साफ समाधान है जिसे मैं सोच सकता हूं; क्या इसमें कुछ गड़बड़ है? – Piskvor

+1

अच्छी तरह से, आप बस चेक को अक्षम करना चाहते हैं और कोड परिवर्तन के बिना ऐसा करना चाहते हैं। आम तौर पर आपके पास एसएसएल कनेक्शन को नियंत्रित करने के लिए बहुत सारी गुण हैं, लेकिन स्पष्ट रूप से इस मामले में नहीं ... – paweloque

+0

अच्छी तरह से, आप * होस्टनाम सत्यापनकर्ता * फैक्ट्री * बना सकते हैं जो आपकी कस्टम प्रॉपर्टी की जांच करेगा और "हमेशा-ठीक" डमी सत्यापनकर्ता को वापस करेगा यदि यह सेट है, या डिफ़ॉल्ट सत्यापनकर्ता यदि नहीं है; हालांकि, यह वास्तव में इस मुद्दे को हल नहीं करता है, है ना? – Piskvor

उत्तर

3

मानक जावा एसएसएल सॉकेट या वास्तव में कोई होस्टनाम सत्यापन भी नहीं है एसएसएल, इसलिए आप इसे उस स्तर पर सेट नहीं कर सकते हैं। होस्टनाम सत्यापन HTTPS (आरएफसी 2818) का हिस्सा है: यही कारण है कि यह खुद को javax.net.ssl.HostnameVerifier के रूप में प्रकट करता है, जिसे HttpsURLConnection पर लागू किया जाता है।

import javax.net.ssl.*; 
import java.lang.instrument.Instrumentation; 

public class LenientHostnameVerifierAgent { 
    public static void premain(String args, Instrumentation inst) { 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
      public boolean verify(String s, SSLSession sslSession) { 
       return true; 
      } 
     }); 
    } 
} 

तो बस कार्यक्रम के जावा स्टार्टअप तर्कों को --javaagent:LenientHostnameVerifierAgent.jar जोड़ें:

+0

यह उचित लगता है, हालांकि, वेबलॉगिक ऐसा स्विच क्यों प्रदान करता है और HttpsURLConnection स्तर पर ऐसी कोई संपत्ति क्यों नहीं है? – paweloque

+0

@lewap मुझे लगता है कि ये प्रश्न अशिष्ट हैं? मैं WebLogic के बारे में प्रश्नों का उत्तर नहीं दे सकता, या जेडीके इस तरह से क्यों है। वेबलॉगिक चीज मुझे सुरक्षा छेद की तरह दिखती है, मैं इसे जेडीके में नहीं चाहूंगा। – EJP

+3

वे बिल्कुल अशिष्ट नहीं हैं, मैं समझने की कोशिश कर रहा हूं कि एसएसएल कैसे काम करता है और जेडीके और वेबलॉगिक के बीच अंतर को समझने के लिए। शायद इसके लिए एक कारण है। – paweloque

23

ऐसा नहीं है कि डिफ़ॉल्ट HostnameVerifier ओवरराइड करता है कस्टम java agent बनाने के लिए संभव हो जाना चाहिए।

+1

यह इसे संभालने का एक शानदार तरीका हो सकता है, लेकिन मैं अपाचे के http क्लाइंट से निपट रहा हूं। मैं 'SSLSocketFactory.setHostnameVerifier (नया AllowAllHostnameVerifier()) सेट करने के लिए एक जावाएन्ट कैसे बना सकता हूं? –

+0

@ एंड-यूजर, वैसे ही इस तरह के जवाब में। – Vadzim

3

मुझे रीस्टफुल वेब सेवाओं तक पहुंचने के दौरान भी वही समस्या थी। और मैं उनके मुद्दे को दूर करने के लिए नीचे दिए गए कोड के साथ:

public class Test { 
    //Bypassing the SSL verification to execute our code successfully 
    static { 
     disableSSLVerification(); 
    } 

    public static void main(String[] args) {  
     //Access HTTPS URL and do something  
    } 
    //Method used for bypassing SSL verification 
    public static void disableSSLVerification() { 

     TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 

      public void checkClientTrusted(X509Certificate[] certs, String authType) { 
      } 

      public void checkServerTrusted(X509Certificate[] certs, String authType) { 
      } 

     } }; 

     SSLContext sc = null; 
     try { 
      sc = SSLContext.getInstance("SSL"); 
      sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     } catch (KeyManagementException e) { 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } 
     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

     HostnameVerifier allHostsValid = new HostnameVerifier() { 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     };  
     HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);   
    } 
} 

यह मेरे लिए काम करता है। कोशिश करो!!

+0

यह समाधान मेरे लिए काम नहीं किया है। – seanmcl

+3

यह असुरक्षित रूप से सभी प्रमाणपत्रों पर भरोसा करता है, लेकिन यह होस्टनाम सत्यापन को बाईपास नहीं करता है, इसलिए यह प्रश्न का उत्तर नहीं देता है। – EJP

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