दिलचस्प पोस्ट
Lex & Yacc (Solaris) में stdin के बजाय स्ट्रिंग में YY_INPUT बिंदु कैसे बनाएं क्लास ऑब्जेक्ट का नाम जावास्क्रिप्ट में स्ट्रिंग के रूप में कैसे प्राप्त करें? अपने मूल तत्वों के आधार पर किसी तत्व को सीएसएस शैलियों को लागू करें App.config पर भरोसा किए बिना SOAP वेब सेवा का उपयोग करें जावास्क्रिप्ट में फ़ाइल को बेस 64 में कैसे परिवर्तित करें? फ़ंक्शन को टेम्पलेट तर्क के रूप में पारित किया गया क्या कोई div में शब्द शब्द लपेटने का एक तरीका है? jQuery के गिनती बच्चे तत्व एंड्रॉइड कई भाषाओं का समर्थन करते हैं? PHP काम नहीं कर रहा है – विंडोज 7 64 बिट पर WAMP यह क्या होता है "(फ़ंक्शन () {});", ब्रैकेट के अंदर फ़ंक्शन, जावास्क्रिप्ट में क्या मतलब है? LINQ + फ़ॉरचा vs बनाम + अगर क्या तेज़ है? CSS3 संक्रमण या jQuery एनिमेशन? कैसे आप दृश्य स्टूडियो में ऑटो प्रारूप कोड करते हैं? गिट: छिपाने की जगह को लागू किए बिना एक छिपाने की जगह में देखें

Apache HttpClient 4.0 में SSL प्रमाणपत्र त्रुटियों को कैसे अनदेखा करें

मैं अपाचे एचटीटीपीएल 4.0 4.0 के साथ अवैध SSL प्रमाणपत्र त्रुटियों को बाईपास कैसे करूं?

Solutions Collecting From Web of "Apache HttpClient 4.0 में SSL प्रमाणपत्र त्रुटियों को कैसे अनदेखा करें"

आपको अपने TrustManager से SSLContext बनाने और इस संदर्भ का उपयोग करके HTTPS योजना बनाने की आवश्यकता है। यहां कोड है,

SSLContext sslContext = SSLContext.getInstance("SSL"); // set up a TrustManager that trusts everything sslContext.init(null, new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { System.out.println("getAcceptedIssuers ============="); return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { System.out.println("checkClientTrusted ============="); } public void checkServerTrusted(X509Certificate[] certs, String authType) { System.out.println("checkServerTrusted ============="); } } }, new SecureRandom()); SSLSocketFactory sf = new SSLSocketFactory(sslContext); Scheme httpsScheme = new Scheme("https", 443, sf); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(httpsScheme); // apache HttpClient version >4.2 should use BasicClientConnectionManager ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry); HttpClient httpClient = new DefaultHttpClient(cm); 

अन्य सभी उत्तर या तो हटाए गए या एचटीटीपी क्लाएंट 4.3 के लिए काम नहीं किया।

यहां एक HTTP क्लाइंट बनाने पर सभी होस्टनामों की अनुमति देने का एक तरीका है

 CloseableHttpClient httpClient = HttpClients .custom() .setHostnameVerifier(AllowAllHostnameVerifier.INSTANCE) .build(); 

या यदि आप संस्करण 4.4 या बाद के संस्करण का उपयोग कर रहे हैं, तो अपडेट किए गए कॉल इस प्रकार दिखता है:

 CloseableHttpClient httpClient = HttpClients .custom() .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .build(); 

रिकॉर्ड के लिए, एचटीटीपीएक्स 4.1 के साथ ही पूरा करने का एक बहुत आसान तरीका है

  SSLSocketFactory sslsf = new SSLSocketFactory(new TrustStrategy() { public boolean isTrusted( final X509Certificate[] chain, String authType) throws CertificateException { // Oh, I am easy... return true; } }); 

रिकॉर्ड के लिए, httpclient 4.3.6 के साथ परीक्षण किया गया और धाराप्रवाह एपीआई के निष्पादक के साथ संगत:

 CloseableHttpClient httpClient = HttpClients.custom(). setHostnameVerifier(new AllowAllHostnameVerifier()). setSslcontext(new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return true; } }).build()).build(); 

अपाचे एचटीटीपी क्लायंट के लिए 4.4:

 HttpClientBuilder b = HttpClientBuilder.create(); SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return true; } }).build(); b.setSslcontext( sslContext); // or SSLConnectionSocketFactory.getDefaultHostnameVerifier(), if you don't want to weaken HostnameVerifier hostnameVerifier = SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", sslSocketFactory) .build(); // allows multi-threaded use PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager( socketFactoryRegistry); b.setConnectionManager( connMgr); HttpClient client = b.build(); 

यह हमारे वास्तविक कार्य निष्पादन से निकाला गया है

अन्य जवाब लोकप्रिय हैं, लेकिन एचटीटीपी क्लायंट 4.4 के लिए वे काम नहीं करते हैं। मैं घंटों की कोशिश कर रहा हूं और संभावनाओं को थकाता हूं, लेकिन ऐसा लगता है कि 4.4 में बहुत बड़ा एपीआई बदलाव और स्थानांतर रहा है।

यहां पर थोड़ा सा फुलर विवरण देखें: http://literatejava.com/networks/ignore-ssl-certificate-errors-apache-httpclient-4-4/

उम्मीद है की वो मदद करदे!

यदि आप जो करना चाहते हैं, अमान्य होस्टनाम त्रुटियों से छुटकारा पाएं, जो आप कर सकते हैं:

 HttpClient httpClient = new DefaultHttpClient(); SSLSocketFactory sf = (SSLSocketFactory)httpClient.getConnectionManager() .getSchemeRegistry().getScheme("https").getSocketFactory(); sf.setHostnameVerifier(new AllowAllHostnameVerifier()); 

मैंने इस तरह से इसे किया –

  1. मेरी खुद की MockSSLSocketFactory (नीचे संलग्न कक्षा) बनाएँ
  2. इसे प्रारंभ करने के लिए Use DefaultHttpClient यदि एक प्रॉक्सी उपयोग किया जाता है तो प्रॉक्सी सेटिंग प्रदान की जानी चाहिए।

DefaultHTTP क्लाइंट आरंभ करना –

 SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); schemeRegistry.register(new Scheme("https", 443, new MockSSLSocketFactory())); ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry); DefaultHttpClient httpclient = new DefaultHttpClient(cm); 

नकली एसएसएल फैक्टरी –

 public class MockSSLSocketFactory extends SSLSocketFactory { public MockSSLSocketFactory() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(trustStrategy, hostnameVerifier); } private static final X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() { @Override public void verify(String host, SSLSocket ssl) throws IOException { // Do nothing } @Override public void verify(String host, X509Certificate cert) throws SSLException { //Do nothing } @Override public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException { //Do nothing } @Override public boolean verify(String s, SSLSession sslSession) { return true; } }; private static final TrustStrategy trustStrategy = new TrustStrategy() { @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }; } 

अगर प्रॉक्सी के पीछे, यह करने की आवश्यकता है –

 HttpParams params = new BasicHttpParams(); params.setParameter(AuthPNames.PROXY_AUTH_PREF, getClientAuthPrefs()); DefaultHttpClient httpclient = new DefaultHttpClient(cm, params); httpclient.getCredentialsProvider().setCredentials( new AuthScope(proxyHost, proxyPort), new UsernamePasswordCredentials(proxyUser, proxyPass)); 

हम HTTPClient 4.3.5 का उपयोग कर रहे हैं और हमने स्टैक ओवरफ्लो पर लगभग सभी समाधानों की कोशिश की लेकिन कुछ भी नहीं, समस्या को समझने और समझने के बाद, हम निम्नलिखित कोड पर आते हैं जो पूरी तरह से काम करता है, बस एचटीटीपी क्लाइंट इंस्टेंस बनाने से पहले इसे जोड़ें।

पोस्ट करने का अनुरोध करते समय कॉल करने के लिए कुछ विधि ….

 SSLContextBuilder builder = new SSLContextBuilder(); builder.loadTrustMaterial(null, new TrustStrategy() { @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }); SSLConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(builder.build(), SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslSF).build(); HttpPost postRequest = new HttpPost(url); 

अपना अनुरोध सामान्य रूप में जारी रखें

इसे बस httpclient-4.5 के साथ करना था और ऐसा लगता है कि उन्होंने 4.4 के बाद से कुछ चीज़ों को नापसंद कर दिया है, इसलिए यहां स्निपेट है जो मेरे लिए काम करता है और सबसे हालिया एपीआई का उपयोग करता है:

 final SSLContext sslContext = new SSLContextBuilder() .loadTrustMaterial(null, (x509CertChain, authType) -> true) .build(); return HttpClientBuilder.create() .setSSLContext(sslContext) .setConnectionManager( new PoolingHttpClientConnectionManager( RegistryBuilder.<ConnectionSocketFactory>create() .register("http", PlainConnectionSocketFactory.INSTANCE) .register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)) .build() )) .build(); 

धाराप्रवाह 4.5.2 के साथ मुझे इसे काम करने के लिए निम्नलिखित संशोधन करना था।

 try { 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 = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new SecureRandom()); CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).setSslcontext(sc).build(); String output = Executor.newInstance(httpClient).execute(Request.Get("https://127.0.0.1:3000/something") .connectTimeout(1000) .socketTimeout(1000)).returnContent().asString(); } catch (Exception e) { } 
  DefaultHttpClient httpclient = new DefaultHttpClient(); SSLContext sslContext; try { sslContext = SSLContext.getInstance("SSL"); // set up a TrustManager that trusts everything try { sslContext.init(null, new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { log.debug("getAcceptedIssuers ============="); return null; } public void checkClientTrusted( X509Certificate[] certs, String authType) { log.debug("checkClientTrusted ============="); } public void checkServerTrusted( X509Certificate[] certs, String authType) { log.debug("checkServerTrusted ============="); } } }, new SecureRandom()); } catch (KeyManagementException e) { } SSLSocketFactory ssf = new SSLSocketFactory(sslContext,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ClientConnectionManager ccm = this.httpclient.getConnectionManager(); SchemeRegistry sr = ccm.getSchemeRegistry(); sr.register(new Scheme("https", 443, ssf)); } catch (Exception e) { log.error(e.getMessage(),e); } 

जेड जेड कोडर के जवाब में विस्तार में मेजबाननामवरिफायर को ओवरराइड करना अच्छा होगा।

 // ... SSLSocketFactory sf = new SSLSocketFactory (sslContext); sf.setHostnameVerifier(new X509HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException { } public void verify(String host, X509Certificate cert) throws SSLException { } public void verify(String host, SSLSocket ssl) throws IOException { } }); // ... 

HttpClient 4.4.x में सभी प्रमाणपत्रों को स्वीकार करने के लिए आप httpClient बनाते समय निम्न एक लाइनर का उपयोग कर सकते हैं:

 httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).setSslcontext(new SSLContextBuilder().loadTrustMaterial(null, (x509Certificates, s) -> true).build()).build(); 

अपाचे एचटीटीपी क्लायंट 4.1.3 के लिए एक पूर्ण कामकाजी संस्करण (ओलेग के कोड पर आधारित है, लेकिन यह अभी भी मेरे सिस्टम पर एक allow_all_hostname_verifier की जरूरत है):

 private static HttpClient trustEveryoneSslHttpClient() { try { SchemeRegistry registry = new SchemeRegistry(); SSLSocketFactory socketFactory = new SSLSocketFactory(new TrustStrategy() { public boolean isTrusted(final X509Certificate[] chain, String authType) throws CertificateException { // Oh, I am easy... return true; } }, org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); registry.register(new Scheme("https", 443, socketFactory)); ThreadSafeClientConnManager mgr = new ThreadSafeClientConnManager(registry); DefaultHttpClient client = new DefaultHttpClient(mgr, new DefaultHttpClient().getParams()); return client; } catch (GeneralSecurityException e) { throw new RuntimeException(e); } } 

नोट: मैं सभी अपवादों को फिर से फेंक रहा हूं क्योंकि वास्तव में, बहुत कुछ नहीं है यदि कोई भी वास्तविक प्रणाली में विफल हो जाता है तो मैं ऐसा नहीं कर सकता!

यदि आप धाराप्रवाह एपीआई का प्रयोग कर रहे हैं, तो आपको इसे Executor माध्यम से सेट करना होगा:

 Executor.unregisterScheme("https"); SSLSocketFactory sslSocketFactory = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); Executor.registerScheme(new Scheme("https", 443, sslSocketFactory)); 

… जहां sslContext SSLContext बनाया गया है जैसा कि ZZ Coder के उत्तर में दिखाया गया है।

इसके बाद, आप अपने http अनुरोधों को निम्नानुसार कर सकते हैं:

 String responseAsString = Request.Get("https://192.168.1.0/whatever.json") .execute().getContent().asString(); 

नोट: एचटीटीपी क्लाएंट 4.2 के साथ परीक्षण किया गया

4.3.3 के साथ परीक्षण किया

 import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class AccessProtectedResource { public static void main(String[] args) throws Exception { // Trust all certs SSLContext sslcontext = buildSSLContext(); // Allow TLSv1 protocol only SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf) .build(); try { HttpGet httpget = new HttpGet("https://yoururl"); System.out.println("executing request" + httpget.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httpget); try { HttpEntity entity = response.getEntity(); System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); } for (Header header : response.getAllHeaders()) { System.out.println(header); } EntityUtils.consume(entity); } finally { response.close(); } } finally { httpclient.close(); } } private static SSLContext buildSSLContext() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException { SSLContext sslcontext = SSLContexts.custom() .setSecureRandom(new SecureRandom()) .loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }) .build(); return sslcontext; } 

}

यदि आप इस समस्या का सामना करते हुए AmazonS3Client, जो अपाचे HttpClient 4.1 को एम्बेड करता है, तो आपको बस इस तरह की एक सिस्टम प्रॉपर्टी को परिभाषित करने की आवश्यकता है ताकि SSL प्रमाणपत्र चेकर शांत हो।

-Dcom.amazonaws.sdk.disableCertChecking = true

शरारत कामयाब

एफव्यू, एक खास "ट्रस्ट ऑल" क्लाइंट बनाने के लिए जेएक्स-आरएस 2.x के "रेस्टएसी" कार्यान्वयन का उपयोग करते हुए एक उदाहरण …

  import java.io.IOException; import java.net.MalformedURLException; import java.security.GeneralSecurityException; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Arrays; import javax.ejb.Stateless; import javax.net.ssl.SSLContext; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.conn.ssl.TrustStrategy; import org.jboss.resteasy.client.jaxrs.ResteasyClient; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget; import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine; import org.apache.http.impl.conn.BasicHttpClientConnectionManager; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.ssl.SSLContexts; @Stateless @Path("/postservice") public class PostService { private static final Logger LOG = LogManager.getLogger("PostService"); public PostService() { } @GET @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public PostRespDTO get() throws NoSuchAlgorithmException, KeyManagementException, MalformedURLException, IOException, GeneralSecurityException { //...object passed to the POST method... PostDTO requestObject = new PostDTO(); requestObject.setEntryAList(new ArrayList<>(Arrays.asList("ITEM0000A", "ITEM0000B", "ITEM0000C"))); requestObject.setEntryBList(new ArrayList<>(Arrays.asList("AAA", "BBB", "CCC"))); //...build special "trust all" client to call POST method... ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(createTrustAllClient()); ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build(); ResteasyWebTarget target = client.target("https://localhost:7002/postRespWS").path("postrespservice"); Response response = target.request().accept(MediaType.APPLICATION_JSON).post(Entity.entity(requestObject, MediaType.APPLICATION_JSON)); //...object returned from the POST method... PostRespDTO responseObject = response.readEntity(PostRespDTO.class); response.close(); return responseObject; } //...get special "trust all" client... private static CloseableHttpClient createTrustAllClient() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, TRUSTALLCERTS).useProtocol("TLS").build(); HttpClientBuilder builder = HttpClientBuilder.create(); NoopHostnameVerifier noop = new NoopHostnameVerifier(); SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, noop); builder.setSSLSocketFactory(sslConnectionSocketFactory); Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("https", sslConnectionSocketFactory).build(); HttpClientConnectionManager ccm = new BasicHttpClientConnectionManager(registry); builder.setConnectionManager(ccm); return builder.build(); } private static final TrustStrategy TRUSTALLCERTS = new TrustStrategy() { @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }; } 

संबंधित मेवेन निर्भरताएं

  <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-client</artifactId> <version>3.0.10.Final</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>jaxrs-api</artifactId> <version>3.0.10.Final</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson2-provider</artifactId> <version>3.0.10.Final</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5</version> <type>jar</type> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency>