Apache HttpClient 4.3 में SSL प्रमाणपत्र की अनदेखी


102

Apache HttpClient 4.3 के लिए SSL प्रमाणपत्र (सभी पर भरोसा) को कैसे अनदेखा करें ?

एसओ पर मुझे मिले सभी उत्तर पिछले संस्करणों का इलाज करते हैं, और एपीआई बदल गया।

सम्बंधित:

संपादित करें:

  • यह केवल परीक्षण के उद्देश्य के लिए है। बच्चे, इसे घर पर न आजमाएँ (या उत्पादन में)

जवाबों:


146

नीचे दिया गया कोड स्व-हस्ताक्षरित प्रमाणपत्रों पर भरोसा करने के लिए काम करता है। आपको अपना क्लाइंट बनाते समय TrustSelfSignedStrategy का उपयोग करना होगा :

SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
        builder.build());
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(
        sslsf).build();

HttpGet httpGet = new HttpGet("https://some-server");
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
    System.out.println(response.getStatusLine());
    HttpEntity entity = response.getEntity();
    EntityUtils.consume(entity);
} finally {
    response.close();
}

मैंने इस SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERउद्देश्य को शामिल नहीं किया था : बिंदु था स्व-हस्ताक्षरित प्रमाणपत्रों के साथ परीक्षण की अनुमति देना ताकि आपको प्रमाणीकरण प्राधिकारी से उचित प्रमाणपत्र प्राप्त न करना पड़े। आप आसानी से सही होस्ट नाम के साथ एक स्व-हस्ताक्षरित प्रमाण पत्र बना सकते हैं, इसलिए SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERध्वज को जोड़ने के बजाय ऐसा करें ।


8
मुझे इस तर्क को SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER को HttpClientBuilder (जैसा कि vmkt की holmis83 की प्रतिक्रिया में उल्लेख किया गया है) के साथ काम करने के लिए जोड़ना था।
dejuknow

भी httpclient साइट पर उदाहरण को देखें hc.apache.org/httpcomponents-client-4.3.x/httpclient/examples/...
arajashe

2
मुझे ALLOW_ALL_HOSTNAME_VERIFIER: SSLConnectionSocketFactory (buildder.build (), SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) का उपयोग करना पड़ा;
प्रदर्शित नाम

यह कोड तर्क के साथ पदावनत कंस्ट्रक्टर का उपयोग किए बिना मेरे लिए काम करता हैSSLConnectionSocketFactory.ALLOW_‌​ALL_HOSTNAME_VERIFIER
उपयोगकर्ता 11153

काश आपने जिस वर्ग का उपयोग कर रहे थे, उसका पूरा संदर्भ निर्दिष्ट किया होता। कहा जाने वाले कई वर्ग SSLContextBuilderआइडिया द्वारा पाए जाते हैं।
मास्टरमाइंड

91

यदि आप ऊपर दिए गए PoolingHttpClientConnectionManager प्रक्रिया का उपयोग नहीं कर रहे हैं, तो कस्टम SSLContext को अनदेखा कर दिया जाता है। PoolingHttpClientConnectionManager को बनाते समय आपको संदूक में सॉकेटफ़ेक्टरीरैगिस्ट्री पास करनी होगी।

SSLContextBuilder builder = SSLContexts.custom();
builder.loadTrustMaterial(null, new TrustStrategy() {
    @Override
    public boolean isTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        return true;
    }
});
SSLContext sslContext = builder.build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
        sslContext, new X509HostnameVerifier() {
            @Override
            public void verify(String host, SSLSocket ssl)
                    throws IOException {
            }

            @Override
            public void verify(String host, X509Certificate cert)
                    throws SSLException {
            }

            @Override
            public void verify(String host, String[] cns,
                    String[] subjectAlts) throws SSLException {
            }

            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
        .<ConnectionSocketFactory> create().register("https", sslsf)
        .build();

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(
        socketFactoryRegistry);
CloseableHttpClient httpclient = HttpClients.custom()
        .setConnectionManager(cm).build();

11
अपने स्वयं के X509HostnameVerifier के निर्माण के बजाय, आप SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER का उपयोग कर सकते हैं।
holmis83

जैसा कि @ rich95 द्वारा नीचे चिह्नित किया गया है, HttpClients के लिए डिफ़ॉल्ट आपको एक पूलिंगहॉटप्लिएंट देना है, इसलिए यह बहुत बार प्रासंगिक है। मुझे इसकी ज़रूरत पड़ने से पहले इन जवाबों में से काफी कोशिश करनी थी।
SunSear

1
WebSphere पर इसे लागू करने की कोशिश की गई और "java.security.KeyStoreException: IBMTrustManager: ट्रस्ट स्टोर पर पहुंचने में समस्या हो रही है java.io.IOException: अमान्य कीस्टॉर प्रारूप" पास की जरूरत से बचने के लिए KeyStore TrustStore = KeyStore.getInstance (KeyStore.getDefault) को टाइप करें। null to buildder.loadTrustMaterial के बजाय
Georgy Gobozov

1
वास्तव में, HttpClient 4.5 के साथ, दोनों HttpClients.custom().setConnectionManager(cm).build()और HttpClients.custom().setSSLSocketFactory(connectionFactory).build()काम करेंगे, इसलिए आपको PoolingHttpClientConnectionManager
soulmachine

इसे बनाने के बाद PoolingHttpClientConnectionManager का उपयोग कैसे करें, मेरा कोड काम कर रहा है, लेकिन मैं जानना चाहता हूं कि कनेक्शन पूलिंग का काम करता है या नहीं
Labeo

34

@Mavroprovato के उत्तर के अतिरिक्त, यदि आप केवल स्व-हस्ताक्षरित के बजाय सभी प्रमाणपत्रों पर भरोसा करना चाहते हैं, तो आप (अपने कोड की शैली में) करेंगे

builder.loadTrustMaterial(null, new TrustStrategy(){
    public boolean isTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {
        return true;
    }
});

या (मेरे अपने कोड से सीधे कॉपी-पेस्ट):

import javax.net.ssl.SSLContext;
import org.apache.http.ssl.TrustStrategy;
import org.apache.http.ssl.SSLContexts;

// ...

        SSLContext sslContext = SSLContexts
                .custom()
                //FIXME to contain real trust store
                .loadTrustMaterial(new TrustStrategy() {
                    @Override
                    public boolean isTrusted(X509Certificate[] chain,
                        String authType) throws CertificateException {
                        return true;
                    }
                })
                .build();

और यदि आप hostname सत्यापन को भी छोड़ना चाहते हैं, तो आपको सेट करने की आवश्यकता है

    CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(
            sslsf).setSSLHostnameVerifier( NoopHostnameVerifier.INSTANCE).build();

भी। (ALLOW_ALL_HOSTNAME_VERIFIER पदावनत हो गया है)।

अनिवार्य चेतावनी: आपको वास्तव में ऐसा नहीं करना चाहिए, सभी प्रमाणपत्रों को स्वीकार करना एक बुरी बात है। हालांकि कुछ दुर्लभ उपयोग के मामले हैं जहां आप ऐसा करना चाहते हैं।

पहले दिए गए कोड को नोट के रूप में, आप प्रतिक्रिया को बंद करना चाहते हैं, भले ही httpclient.execute () एक अपवाद फेंकता है

CloseableHttpResponse response = null;
try {
    response = httpclient.execute(httpGet);
    System.out.println(response.getStatusLine());
    HttpEntity entity = response.getEntity();
    EntityUtils.consume(entity);
}
finally {
    if (response != null) {
        response.close();
    }
}

उपरोक्त कोड का उपयोग करके परीक्षण किया गया था

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.3</version>
</dependency>

और दिलचस्पी के लिए, यहाँ मेरा पूरा परीक्षण सेट है:

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.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.apache.http.util.EntityUtils;
import org.junit.Test;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.SSLPeerUnverifiedException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class TrustAllCertificatesTest {
    final String expiredCertSite = "https://expired.badssl.com/";
    final String selfSignedCertSite = "https://self-signed.badssl.com/";
    final String wrongHostCertSite = "https://wrong.host.badssl.com/";

    static final TrustStrategy trustSelfSignedStrategy = new TrustSelfSignedStrategy();
    static final TrustStrategy trustAllStrategy = new TrustStrategy(){
        public boolean isTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            return true;
        }
    };

    @Test
    public void testSelfSignedOnSelfSignedUsingCode() throws Exception {
        doGet(selfSignedCertSite, trustSelfSignedStrategy);
    }
    @Test(expected = SSLHandshakeException.class)
    public void testExpiredOnSelfSignedUsingCode() throws Exception {
        doGet(expiredCertSite, trustSelfSignedStrategy);
    }
    @Test(expected = SSLPeerUnverifiedException.class)
    public void testWrongHostOnSelfSignedUsingCode() throws Exception {
        doGet(wrongHostCertSite, trustSelfSignedStrategy);
    }

    @Test
    public void testSelfSignedOnTrustAllUsingCode() throws Exception {
        doGet(selfSignedCertSite, trustAllStrategy);
    }
    @Test
    public void testExpiredOnTrustAllUsingCode() throws Exception {
        doGet(expiredCertSite, trustAllStrategy);
    }
    @Test(expected = SSLPeerUnverifiedException.class)
    public void testWrongHostOnTrustAllUsingCode() throws Exception {
        doGet(wrongHostCertSite, trustAllStrategy);
    }

    @Test
    public void testSelfSignedOnAllowAllUsingCode() throws Exception {
        doGet(selfSignedCertSite, trustAllStrategy, NoopHostnameVerifier.INSTANCE);
    }
    @Test
    public void testExpiredOnAllowAllUsingCode() throws Exception {
        doGet(expiredCertSite, trustAllStrategy, NoopHostnameVerifier.INSTANCE);
    }
    @Test
    public void testWrongHostOnAllowAllUsingCode() throws Exception {
        doGet(expiredCertSite, trustAllStrategy, NoopHostnameVerifier.INSTANCE);
    }

    public void doGet(String url, TrustStrategy trustStrategy, HostnameVerifier hostnameVerifier) throws Exception {
        SSLContextBuilder builder = new SSLContextBuilder();
        builder.loadTrustMaterial(trustStrategy);
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                builder.build());
        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(
                sslsf).setSSLHostnameVerifier(hostnameVerifier).build();

        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response = httpclient.execute(httpGet);
        try {
            System.out.println(response.getStatusLine());
            HttpEntity entity = response.getEntity();
            EntityUtils.consume(entity);
        } finally {
            response.close();
        }
    }
    public void doGet(String url, TrustStrategy trustStrategy) throws Exception {

        SSLContextBuilder builder = new SSLContextBuilder();
        builder.loadTrustMaterial(trustStrategy);
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                builder.build());
        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(
                sslsf).build();

        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response = httpclient.execute(httpGet);
        try {
            System.out.println(response.getStatusLine());
            HttpEntity entity = response.getEntity();
            EntityUtils.consume(entity);
        } finally {
            response.close();
        }
    }
}

( जीथब में काम कर रहे परीक्षण प्रोजेक्ट )


1
HttpClient # निष्पादित कभी अपवाद के मामले में एक अशक्त प्रतिक्रिया वस्तु नहीं देगा। इसके अलावा, स्टॉक HttpClient कार्यान्वयन अनुरोध के निष्पादन के दौरान अपवाद के मामले में सभी सिस्टम संसाधनों जैसे पट्टे पर कनेक्शन के स्वत: निपटान को सुनिश्चित करेगा। माव्रप्रोवेटो द्वारा उपयोग किए जाने वाले अपवाद की हैंडलिंग पूरी तरह से पर्याप्त है।
ओके 2 सी

@ क्लोजेबल इंटरफ़ेस का बिंदु "बंद [...] स्ट्रीम है और इसके साथ जुड़े किसी भी सिस्टम संसाधन को जारी करना है। यदि धारा पहले से ही बंद है तो इस विधि को लागू करने से कोई प्रभाव नहीं पड़ता है।" इसलिए जरूरत पड़ने पर भी इसका इस्तेमाल करना सबसे अच्छा अभ्यास है। इसके अलावा, मैं अशक्त प्रतिक्रिया लौटने की टिप्पणी को नहीं समझता - बेशक यह नहीं है, अगर यह एक अपवाद फेंकता है, तो यह कुछ भी वापस नहीं करता है?
eis

1
Apache HttpClient कभी भी एक अशक्त या आंशिक रूप से प्रारंभिक प्रतिक्रिया वस्तु नहीं देता है। इससे कितनी बार #close का आह्वान होता है, इससे कोई लेना-देना नहीं है, बल्कि अंतत: खण्ड में पूरी तरह से अनावश्यक
अशक्तता

@oleg और कभी भी कोड नहीं दिया है मैंने मान लिया है कि यह एक अशक्त या आंशिक रूप से प्रारंभिक प्रतिक्रिया वस्तु लौटाएगा, या यहां तक ​​कि इस तरह के मामले की जांच करेगा। मेरे पास कोई सुराग नहीं है कि आप किस बारे में बात कर रहे हैं?
ईआईएस

1
[ विलाप ] जो पूरी तरह से अनावश्यक यह देखते हुए कि HttpResponse बातिल और एक अपवाद #execute विधि एक प्रतिक्रिया ;-) लौटने के बिना समाप्त कर देगा के मामले में कभी नहीं कर सकते हैं
ok2c

22

Vasekt द्वारा उत्तर के लिए एक छोटा सा जोड़:

सॉकेटफ़ेक्टरीरैजिस्ट्री के साथ प्रदान किया गया समाधान, पूलिंगहॉटप्लिएंटकॉन्नेक्शन मैनजर का उपयोग करते समय काम करता है।

हालाँकि, सादे http के माध्यम से कनेक्शन अब और काम नहीं करते हैं। आपको http प्रोटोकॉल के लिए एक PlainConnectionSocketFactory अतिरिक्त रूप से जोड़ना होगा ताकि वे फिर से काम कर सकें:

Registry<ConnectionSocketFactory> socketFactoryRegistry = 
  RegistryBuilder.<ConnectionSocketFactory> create()
  .register("https", sslsf)
  .register("http", new PlainConnectionSocketFactory()).build();

मेरा मानना ​​है कि httpप्रोटोकॉल PlainConnectionSocketFactory डिफ़ॉल्ट रूप से उपयोग कर रहा है । मैंने केवल पंजीकृत किया httpsऔर httpclientअभी भी सादे HTTP URL प्राप्त कर सकते हैं। इसलिए मुझे नहीं लगता कि यह कदम आवश्यक है।
soulmachine

@soulmachine इसके लिए नहीं होगाPoolingHttpClientConnectionManager
amseager

15

विभिन्न विकल्पों की कोशिश करने के बाद, निम्नलिखित कॉन्फ़िगरेशन ने http और https दोनों के लिए काम किया

        SSLContextBuilder builder = new SSLContextBuilder();
        builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);


        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", new PlainConnectionSocketFactory())
                .register("https", sslsf)
                .build();


        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
        cm.setMaxTotal(2000);//max connection


        //System.setProperty("jsse.enableSNIExtension", "false"); //""
        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(sslsf)
                .setConnectionManager(cm)
                .build();

मैं http- क्लाइंट का उपयोग कर रहा हूँ 4.3.3 -

compile 'org.apache.httpcomponents:httpclient:4.3.3'


1
एक व्यापक, पूरी तरह से काम करने का उदाहरण देने के लिए धन्यवाद! मैं पिछले समाधानों के साथ कई मुद्दों को मार रहा था और इससे काफी मदद मिली। यह भी मदद की कि आप आयात विवरण प्रदान करते हैं, क्योंकि एक ही नाम के साथ कई वर्ग हैं, भ्रम को जोड़ते हुए।
हेली

8

सरल और कम काम कोड:

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

कुछ विधि जो आप पोस्ट अनुरोध करने के लिए उपयोग करते हैं ...

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);

सामान्य रूप में HttpPost उदाहरण को कॉल करना और उपयोग करना जारी रखें


हम हेडर में डेटा कैसे पोस्ट कर सकते हैं? अगर हमने किया, तो HTTP / 1.1 400 खराब अनुरोध

6

यहाँ उपरोक्त तकनीकों का एक काम आसवन है, जो "कर्ल - बिन्सक्योर" के बराबर है:

HttpClient getInsecureHttpClient() throws GeneralSecurityException {
    TrustStrategy trustStrategy = new TrustStrategy() {
        @Override
        public boolean isTrusted(X509Certificate[] chain, String authType) {
            return true;
        }
    };

    HostnameVerifier hostnameVerifier = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    return HttpClients.custom()
            .setSSLSocketFactory(new SSLConnectionSocketFactory(
                    new SSLContextBuilder().loadTrustMaterial(trustStrategy).build(),
                    hostnameVerifier))
            .build();
}

5

Http क्लाइंट 4.5 का उपयोग करते समय मुझे किसी भी होस्टनाम (परीक्षण उद्देश्यों के लिए) की अनुमति देने के लिए javasx.net.ssl.HostnameVerifier का उपयोग करना पड़ा। यहाँ है कि मैं क्या कर रहा है:

CloseableHttpClient httpClient = null;
    try {
        SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
        sslContextBuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());

        HostnameVerifier hostnameVerifierAllowAll = new HostnameVerifier() 
            {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };

        SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), hostnameVerifierAllowAll);

        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
            new AuthScope("192.168.30.34", 8443),
            new UsernamePasswordCredentials("root", "password"));

        httpClient = HttpClients.custom()
            .setSSLSocketFactory(sslSocketFactory)
            .setDefaultCredentialsProvider(credsProvider)
            .build();

        HttpGet httpGet = new HttpGet("https://192.168.30.34:8443/axis/services/getStuff?firstResult=0&maxResults=1000");

        CloseableHttpResponse response = httpClient.execute(httpGet);

        int httpStatus = response.getStatusLine().getStatusCode();
        if (httpStatus >= 200 && httpStatus < 300) { [...]
        } else {
            throw new ClientProtocolException("Unexpected response status: " + httpStatus);
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    }
    finally {
        try {
            httpClient.close();
        } catch (IOException ex) {
            logger.error("Error while closing the HTTP client: ", ex);
        }
    }

HostnameVerifier के कार्यान्वयन ने HTTPClient 4.5 के लिए समस्या को हल किया।
digz6666

जो लोग लंबोदर (JDK1.8) से प्यार करते हैं, उनके SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), hostnameVerifierAllowAll);साथ बदल सकते हैं SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), (hostName, sslSession) -> true);। यह अनाम वर्ग से बचता है और कोड को थोड़ा अधिक पठनीय बनाता है।
विल्लिंको

3

शीर्ष पर PoolingHttpClientConnectionManagerसाथ में Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslFactory).build(); यदि आप PoolingNHttpClientConnectionManagerकोड का उपयोग कर एक अतुल्यकालिक httpclient चाहते हैं, तो निम्न के समान होना चाहिए

SSLContextBuilder builder = SSLContexts.custom();
builder.loadTrustMaterial(null, new TrustStrategy() {
    @Override
    public boolean isTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        return true;
    }
});
SSLContext sslContext = builder.build();
SchemeIOSessionStrategy sslioSessionStrategy = new SSLIOSessionStrategy(sslContext, 
                new HostnameVerifier(){
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;// TODO as of now allow all hostnames
            }
        });
Registry<SchemeIOSessionStrategy> sslioSessionRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create().register("https", sslioSessionStrategy).build();
PoolingNHttpClientConnectionManager ncm  = new PoolingNHttpClientConnectionManager(new DefaultConnectingIOReactor(),sslioSessionRegistry);
CloseableHttpAsyncClient asyncHttpClient = HttpAsyncClients.custom().setConnectionManager(ncm).build();
asyncHttpClient.start();        

3

यदि आप उपयोग कर रहे हैं HttpClient 4.5.x, तो आपका कोड निम्नलिखित के समान हो सकता है:

SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null,
        TrustSelfSignedStrategy.INSTANCE).build();
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(
        sslContext, NoopHostnameVerifier.INSTANCE);

HttpClient httpClient = HttpClients.custom()
                                   .setDefaultCookieStore(new BasicCookieStore())
                                   .setSSLSocketFactory(sslSocketFactory)
                                   .build();

मेरे लिए काम नहीं किया। मैं HttpClient का उपयोग कर रहा हूं: 4.5.5। और HttpCore 4.4.9
विजय कुमार

2
class ApacheHttpClient {

    /***
     * This is a https get request that bypasses certificate checking and hostname verifier.
     * It uses basis authentication method.
     * It is tested with Apache httpclient-4.4.
     * It dumps the contents of a https page on the console output.
     * It is very similar to http get request, but with the additional customization of
     *   - credential provider, and
     *   - SSLConnectionSocketFactory to bypass certification checking and hostname verifier.
     * @param path String
     * @param username String
     * @param password String
     * @throws IOException
     */
    public void get(String path, String username, String password) throws IOException {
        final CloseableHttpClient httpClient = HttpClients.custom()
                .setDefaultCredentialsProvider(createCredsProvider(username, password))
                .setSSLSocketFactory(createGenerousSSLSocketFactory())
                .build();

        final CloseableHttpResponse response = httpClient.execute(new HttpGet(path));
        try {
            HttpEntity entity = response.getEntity();
            if (entity == null)
                return;
            System.out.println(EntityUtils.toString(entity));
        } finally {
            response.close();
            httpClient.close();
        }
    }

    private CredentialsProvider createCredsProvider(String username, String password) {
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
                AuthScope.ANY,
                new UsernamePasswordCredentials(username, password));
        return credsProvider;
    }

    /***
     * 
     * @return SSLConnectionSocketFactory that bypass certificate check and bypass HostnameVerifier
     */
    private SSLConnectionSocketFactory createGenerousSSLSocketFactory() {
        SSLContext sslContext;
        try {
            sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, new TrustManager[]{createGenerousTrustManager()}, new SecureRandom());
        } catch (KeyManagementException | NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
        return new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
    }

    private X509TrustManager createGenerousTrustManager() {
        return new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] cert, String s) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] cert, String s) throws CertificateException {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
    }
}

2

Apache HTTP Client में सभी सेर्ट्स पर भरोसा करें

TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }
                        public void checkClientTrusted(
                            java.security.cert.X509Certificate[] certs, String authType) {
                        }
                        public void checkServerTrusted(
                            java.security.cert.X509Certificate[] certs, String authType) {
                        }
                    }
                };

          try {
                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                        sc);
                httpclient = HttpClients.custom().setSSLSocketFactory(
                        sslsf).build();
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

यह httpclient 4.5.9 के साथ अच्छी तरह से काम करता है, बस पूरी सामग्री को कॉपी और पेस्ट करें।
सथ्य

1

(मैंने सीधे वासेक के उत्तर में एक टिप्पणी जोड़ दी होगी, लेकिन मेरे पास पर्याप्त प्रतिष्ठा अंक नहीं हैं (यकीन नहीं है कि वहां तर्क है)

वैसे भी ... मैं जो कहना चाहता था, वह यह है कि भले ही आप स्पष्ट रूप से पूलिंगकॉन्क्शन बनाने / पूछने के लिए नहीं हैं, इसका मतलब यह नहीं है कि आप एक नहीं हो रहे हैं।

मैं यह जानने की कोशिश कर रहा था कि मूल समाधान मेरे लिए काम क्यों नहीं कर रहा है, लेकिन मैंने vasekt के जवाब को नजरअंदाज कर दिया क्योंकि यह "मेरे मामले पर लागू नहीं हुआ" - गलत!

मैं अपने स्टैक-ट्रेस को देख रहा था जब कम और निहारना मैंने इसके बीच में एक पूलिंगकॉन्क्शन देखा। बैंग - मैं इसके अलावा और सफलता थक गया !! (हमारा डेमो कल है और मैं हताश हो रहा था) :-)


0

आप ssl प्रमाणन जाँच के बिना HttpClient उदाहरण प्राप्त करने के लिए निम्नलिखित कोड स्निपेट का उपयोग कर सकते हैं।

private HttpClient getSSLHttpClient() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {

        LogLoader.serverLog.trace("In getSSLHttpClient()");

        SSLContext context = SSLContext.getInstance("SSL");

        TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };

        context.init(null, new TrustManager[] { tm }, null);

        HttpClientBuilder builder = HttpClientBuilder.create();
        SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(context);
        builder.setSSLSocketFactory(sslConnectionFactory);

        PlainConnectionSocketFactory plainConnectionSocketFactory = new PlainConnectionSocketFactory();
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("https", sslConnectionFactory).register("http", plainConnectionSocketFactory).build();

        PoolingHttpClientConnectionManager ccm = new PoolingHttpClientConnectionManager(registry);
        ccm.setMaxTotal(BaseConstant.CONNECTION_POOL_SIZE);
        ccm.setDefaultMaxPerRoute(BaseConstant.CONNECTION_POOL_SIZE);
        builder.setConnectionManager((HttpClientConnectionManager) ccm);

        builder.disableRedirectHandling();

        LogLoader.serverLog.trace("Out getSSLHttpClient()");

        return builder.build();
    }

0

सोनार सुरक्षा चेतावनी को ठीक करने के लिए @divbyzero ऊपर से थोड़ा जवाब दें

CloseableHttpClient getInsecureHttpClient() throws GeneralSecurityException {
            TrustStrategy trustStrategy = (chain, authType) -> true;

            HostnameVerifier hostnameVerifier = (hostname, session) -> hostname.equalsIgnoreCase(session.getPeerHost());

            return HttpClients.custom()
                    .setSSLSocketFactory(new SSLConnectionSocketFactory(new SSLContextBuilder().loadTrustMaterial(trustStrategy).build(), hostnameVerifier))
                    .build();
        }

0

प्रारंभ में, मैं विश्वास की रणनीति का उपयोग करके स्थानीयहोस्ट के लिए अक्षम करने में सक्षम था, बाद में मैंने NoopHostnameVerifier जोड़ा। अब यह लोकलहोस्ट और मशीन नाम दोनों के लिए काम करेगा

SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(null, new TrustStrategy() {

            @Override
            public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                return true;
            }

        }).build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslContext, NoopHostnameVerifier.INSTANCE);
        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.