2012-09-11 19 views
8

क्या कोई मुझे जावा में सर्वर नाम संकेत के साथ HTTP कनेक्शन करने में मदद करने में मदद कर सकता है?जावा पर सर्वर नाम संकेत (एसएनआई)

मैं उस साइट से सामग्री का अनुरोध करने का प्रयास कर रहा हूं जहां मैं व्यवस्थापक हूं। मैं अपाचे की एचटीपी क्लाइंट लाइब्रेरी का उपयोग कर रहा हूं, लेकिन सुरक्षित सामग्री के लिए मेरा अनुरोध विफल रहता है क्योंकि वेबसाइट केवल HTTPS के लिए एसएनआई का उपयोग करती है, और डिफ़ॉल्ट एचटीपी क्लाइंट में एसएनआई सक्षम नहीं है। मैंने Apache's HttpClient लाइब्रेरी के भीतर इस पर कैसे पहुंचे इस पर निर्देश की तलाश की है, लेकिन मुझे इस दस्तावेज़ के साथ अंत में दिखाई देता है: http://hc.apache.org/httpclient-3.x/sslguide.html, जो पुराना है (जब कोड HttpClient और HttpCore अपाचे के कॉमन्स पैकेज का हिस्सा थे) कोड वापस संदर्भित करते हैं।

तो ... कोई मदद?

उत्तर

11

आप https://issues.apache.org/jira/browse/HTTPCLIENT-1119

ट्रैक करने के लिए जावा 7 की अंतर्निहित ग्राहक कार्यान्वयन चाहते हो सकता है यह समर्थन करने के लिए सक्षम है और (sun.net.www.protocol.https.HttpsClient

से बुलाया SSLSocketImpl # setHost के माध्यम से सुविधा को उजागर करता है जावा 7 उपयोग

new URL("https://cmbntr.sni.velox.ch/").openStream() 

पर

तक httpclient-1119 निश्चित

+1

यह अभी तय है, HttpComponents HttpClient 4.3.2 में उपलब्ध है। –

+0

ओपनजेडीके पर टॉमकैट में एचटीपी क्लाइंट 4.3.2 का उपयोग (संस्करण '1.7.0_111' तक), एसएनआई अभी भी असफल हो जाएगा। ओरेकल हॉटस्पॉट ('1.7.0_80') पर स्विच करने के बाद, एसएनआई ने काम किया। एडब्ल्यूएस बीनस्टॉक पर इसका सामना करने वाले किसी भी व्यक्ति के लिए, जेवीएम को ओरेकल में स्विच करने के लिए इस एबेक्स्टेंशन को देखें: https://gist.github.com/bremeld/6706980 – Sitati

0

ऐसा लगता है कि यह समस्या Java 7 में तय की गई है।

+1

धन्यवाद है। मैं देखता हूं कि यह मामला है। हालांकि, आरएफसी मुझे यह कैसे प्राप्त करने के लिए कोई संकेत नहीं देता है (जमीन से अपने स्वयं के ग्राहक को छोड़कर)। किसी मौजूदा उपकरण का कोई विचार या इसके लिए अपाचे एचटीपी क्लाइंट का उपयोग कैसे करें? – JellicleCat

1

है डे के रूप में एक छोटे से ठीक साथ के तहत लिखा गया: TLS with SNI in Java clients जेडीके 7 में एसएनआई सर्वर समर्थन जोड़ने और X509ExtendedKeyManager के साथ इसे एक साथ उपयोग करना संभव है।

1

मुझे अपाचे विन्यास में सही ढंग से ServerName को विन्यस्त किया गया था के लिए क्या काम किया:

/etc/apache2/sites-avaible/default

<VirtualHost *:443> 
    ServerName foo.domain.com 
    ... 
</VirtualHost> 

तरह https://stackoverflow.com/a/8058839/2088282 में कहा।

4

यह वह जगह है मैं यह कैसे org.apache.httpcomponents के httpclient v4.3 +

private HttpClientConnectionManager createConnectionManager(final SSLContext ctx) { 
    LOG.info("Creating sslConnectionSocketFactory"); 
    final SSLConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(ctx) { 

     @Override 
     protected void prepareSocket(SSLSocket socket) throws IOException { 
      try { 
       System.out.println("************ setting socket HOST property *************"); 
       PropertyUtils.setProperty(socket, HOST, Constants.SNI_HOST); 
      } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException ex) { 
       LOG.error(ex.getMessage()); 
      } 
      super.prepareSocket(socket); 
     } 

    }; 

    LOG.info("Creating connectionRegistry"); 
    final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() 
      .register("https", sslSF) 
      .build(); 

    LOG.info("Creating poolingConnectionManager"); 
    final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); 
    connectionManager.setDefaultMaxPerRoute(MAX_CONNECTIONS_PER_ROUTE); 
    connectionManager.setMaxTotal(MAX_CONNECTIONS); 

    return connectionManager; 
} 

में किया था और यह मैं कैसे बनाया HttpClient

final KeyManager[] keyManagers = createKeyManagers(); 
final TrustManager[] trustManagers = createTrustManagers(); 
final SSLContext ctx = createSslContext(keyManagers, trustManagers); 

final HttpClientConnectionManager connectionManager = createConnectionManager(ctx); 

LOG.info("Creating httpClient"); 
HttpClient httpClient = HttpClients 
     .custom() 
     .setConnectionManager(connectionManager) 
     .build(); 
+0

कृपया 'SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER' का उपयोग न करें। – Bruno

+0

उन लोगों के लिए कुछ स्पष्टीकरण के रूप में मैं था, जो उत्सुक हो सकते हैं: '' PropertyUtils' कॉमन्स-beanutils' से है 'स्ट्रिंग होस्ट =" मेजबान ";' 'Constants.SNI_HOST' सर्वर के DNS होस्ट नाम है आप से कनेक्ट करना चाहते हैं। सबसे महत्वपूर्ण बात: ** कस्टम कारखाने httpclient 4.5.2 ** –

+0

@DaanReid साथ लंबे समय तक आवश्यक नहीं है - आप से "कस्टम कारखाने अब जरूरत है" क्या मतलब है? वहाँ एक डिफ़ॉल्ट कार्यान्वयन है कि हम इस्तेमाल कर सकते हैं है। – Shyam

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