অ্যাপাচি এইচটিটিপিপ্লায়েন্ট 4.0 এ কীভাবে SSL শংসাপত্রের ত্রুটি উপেক্ষা করবেন ignore


125

আমি অ্যাপাচি এইচটিপিপিএল ক্লায়েন্ট 4.0 এর সাথে কীভাবে অবৈধ এসএসএল শংসাপত্রের ত্রুটিগুলি বাইপাস করব ?


12
এটি লক্ষ করা উচিত যে এই প্রশ্নের উত্তরগুলি যা জিজ্ঞাসা করা হয়েছে তার চেয়ে বেশি কিছু করবে না: তারা আপনাকে ত্রুটিটি উপেক্ষা করতে দেয় তবে অন্তর্নিহিত সমস্যাটি সমাধান করতে দেয় না (আগুন লাগানোর পরিবর্তে ধোঁয়ার অ্যালার্ম থেকে ব্যাটারিগুলি সরিয়ে ফেলার মতো) )। শংসাপত্রগুলির এসএসএল / টিএলএস সংযোগের সুরক্ষা নিশ্চিত করার একটি উদ্দেশ্য রয়েছে, এই ত্রুটিগুলি উপেক্ষা করে এমআইটিএম আক্রমণের ঝুঁকির পরিচয় দেয়। ত্রুটি উপেক্ষা করার পরিবর্তে পরীক্ষার শংসাপত্রগুলি ব্যবহার করুন।
ব্রুনো


46
"ধোঁয়ার অ্যালার্ম থেকে ব্যাটারিগুলি সরিয়ে ফেলার মতো" আপনি অন্যান্য বিকাশকারীদের সন্দেহের সুবিধা দিতে পারেন এবং ধরে নিতে পারেন তারা কী করছে। সম্ভবত এই প্রশ্নের অনুপ্রেরণা স্থানীয় পরীক্ষার এবং ওপি জাভা বয়লারপ্লেট এমনকি সাধারণ এসএসএল পরিবেশ স্থাপনের জন্য ভয়াবহ পরিমাণে না গিয়ে দ্রুত পরীক্ষা চালানোর ইচ্ছা করে। হয়তো কেউ "তোমার চেয়ে পবিত্র" বক্তৃতায় না গিয়ে কেবল প্রশ্নের উত্তর দিতে পারে।
মাইক 18

অর্থাত্ আমাদের সংস্থার অভ্যন্তরীণ JIRA সার্ভারে কিছু "উইন্ডোজ সুরক্ষা নীতি ভিত্তিক সার্ট" রয়েছে যা ডোমেনে অন্তর্ভুক্ত উইন্ডোজ মেশিনগুলিতে বৈধ এবং অন্যটিতে বৈধ নয়। আমি এই নীতিটি নিয়ন্ত্রণ করতে পারি না এবং এখনও JIRA REST এপিআই কল করতে চাই।
odiszapc

1
@ ব্রুনো একটি ছোট রান্নাঘরের আগুন নিয়ে কাজ করার সময় 30-60 মিনিটের জন্য ধোঁয়া ডিটেক্টরকে অক্ষম করার অক্ষমতা এমন কোনও আইনি আধিকারিকের ব্যবহারের ধরণগুলির মধ্যে অন্তর্দৃষ্টির উন্মাদ অভাব দেখায় যে আমি অপরাধীর সীমানা বোধ করি। "ধূমপানের অ্যালার্ম থেকে ব্যাটারি অপসারণ" এর ধারণা রয়েছে তা প্রমাণ করে। আমি জানি যে সাধারণ পরীক্ষার জন্য শংসাপত্র পাওয়ার জন্য একই স্তরের রাগ সম্পর্কে আমি জানি যে সুরক্ষা রীতি নেই know এই প্রশ্নের অস্তিত্ব এটি প্রমাণ করে।
বিল কে

উত্তর:


84

আপনার নিজের ট্রাস্টস্ট্যান্টারের সাথে একটি এসএসএল কনটেক্সট তৈরি করতে হবে এবং এই প্রসঙ্গটি ব্যবহার করে এইচটিটিপিএস স্কিম তৈরি করতে হবে। কোডটি এখানে,

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

1
বলুন যে আমি আমার সাইটের জন্য বৈধ এসএসএল শংসাপত্র কিনতে চাই না এবং কেবল এটি ব্যবহার করতে চাই, কোডের এই অংশটি সাহায্য করতে পারে? যেখানে ইউআরএল প্রয়োজন হয় বা ব্যতিক্রম হ্যান্ডলিং প্রয়োজন হয় এমন কোনও অংশ আমি কীভাবে দেখতে পাচ্ছি না?
ভিয়েতনাম

19
হুম, এটি আমাকে জানিয়েছে যে 'নতুন এসএসএলসকেটফ্যাক্টরি (এসএসএলকন্ট)' কোনও এসএসএল কনটেক্সট নয়, একটি কীস্টোরের প্রত্যাশা করছে। আমি কিছু অনুপস্থিত করছি?
এমএসপিড

2
আমি ত্রুটিটি পেয়েছি যে একটি এক্স 509 ট্রাস্টম্যান ম্যানেজার একটি ট্রাস্ট ম্যানেজারে কাস্ট করা যায় না।
মেগাওয়াট

2
নিশ্চিত হয়ে নিন যে আপনি সঠিক প্যাকেজগুলি আমদানি করেছেন, অর্থাত্ org.apache.http থেকে।
ওয়ার্ডেন

2
কেউ কীভাবে এই সমস্ত একসাথে ব্যবহার করে ফেলতে জানেন HttpClientBuilder?
আলী

112

অন্যান্য সমস্ত উত্তর হয় হয় হ্রাস করা হয়েছে বা HTTPClient 4.3 এর জন্য কাজ করে নি।

এখানে একটি HTTP ক্লায়েন্ট তৈরি করার সময় সমস্ত হোস্টনামের অনুমতি দেওয়ার একটি উপায়।

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

বা আপনি যদি 4.4 বা তার পরে সংস্করণ ব্যবহার করছেন তবে আপডেট করা কলটি এর মতো দেখাচ্ছে:

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

উত্তরের জন্য ধন্যবাদ, আমি জানতে চাই যে কোন প্যাকেজটি এইচটিপিএসক্লিয়েন্টস হিসাবে আমি অ্যান্ড্রয়েড সংকলনে ব্যবহার করছি ("org.apache.httpcomp घटक: httpclient: 4.3.4") তবে এই শ্রেণিটি উপস্থিত হয় না।
জুয়ান সরভিয়া

1
এটি প্যাকেজটি org.apache.http.impl.client.HttpClients।
erversteeg

14
এটি হোস্ট নেম মেলে না এমন (আমি ধরে নিই) চারপাশে কাজ করে, তবে শংসাপত্রটি কোনও বিশ্বস্ত কর্তৃপক্ষের দ্বারা স্বাক্ষরিত না হলে এটি কাজ করে না বলে মনে হয়।
twm

1
@twm এ কারণেই এটি "সমস্ত হোস্টনামের অনুমতি দেয়", বিশ্বাসের সমস্যাগুলির জন্য বিভিন্ন কনফিগারেশন প্রয়োজন।
eis

1
@ ইয়েস, আমি উল্লেখ করছিলাম যে এই উত্তরটি নির্দিষ্ট ক্ষেত্রে মূল প্রশ্নটিকে সম্বোধন করে তবে অন্যদের নয়।
twm

43

কেবলমাত্র এটি নতুন এইচটিপিপিলেট ৪.৪ এর সাথে করতে হয়েছিল এবং মনে হয় যে তারা ৪.৪-এর পর থেকে কিছু জিনিস হ্রাস করেছে তাই এখানে স্নিপেটটি আমার পক্ষে কাজ করে এবং অতি সাম্প্রতিক এপিআই ব্যবহার করে:

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

আমার পক্ষে httpclient 4.5.2 এর জন্যও কাজ করেছেন
বিকাশ রঞ্জন

এই এক HttpClient 4.5 জন্য আপ-টু-তারিখ
করছি সন্ত্রস্ত আপনি

31

কেবল রেকর্ডের জন্য, এইচটিটিপিপ্লায়েন্ট ৪.১ দিয়ে এটি সম্পাদন করার জন্য আরও অনেক সহজ উপায় রয়েছে

    SSLSocketFactory sslsf = new SSLSocketFactory(new TrustStrategy() {

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

    });

1
আপনি কি এই নমুনায় কিছু কোড মিস করছেন? HttpClient.set কল হতে পারে ...?
গ্রে

6
httpclient.getConnicationManager ()। getSchemeRegistry ()। নিবন্ধন করুন (নতুন স্কিম ("https", 443, sslsf));
বেন ফ্লিন

8
এসএসএলসকেটফ্যাক্টরিটি এইচটিপিপি্লায়েন্ট ৪.৩
তোয়ালাল

1
জাভা 8 ব্যবহার করে আপনি এমনকিnew SSLSocketFactory((chain, authType) -> true);
jlb

28

অ্যাপাচি এইচটিপিপ্লায়েন্ট 4.5.5

HttpClient httpClient = HttpClients
            .custom()
            .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build())
            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
            .build();

কোনও অবহেলিত এপিআই ব্যবহার করা হয়নি।

সাধারণ যাচাইযোগ্য পরীক্ষার কেস:

package org.apache.http.client.test;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;

public class ApacheHttpClientTest {

    private HttpClient httpClient;

    @Before
    public void initClient() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {
        httpClient = HttpClients
                .custom()
                .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build())
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .build();
    }

    @Test
    public void apacheHttpClient455Test() throws IOException {
        executeRequestAndVerifyStatusIsOk("https://expired.badssl.com");
        executeRequestAndVerifyStatusIsOk("https://wrong.host.badssl.com");
        executeRequestAndVerifyStatusIsOk("https://self-signed.badssl.com");
        executeRequestAndVerifyStatusIsOk("https://untrusted-root.badssl.com");
        executeRequestAndVerifyStatusIsOk("https://revoked.badssl.com");
        executeRequestAndVerifyStatusIsOk("https://pinning-test.badssl.com");
        executeRequestAndVerifyStatusIsOk("https://sha1-intermediate.badssl.com");
    }

    private void executeRequestAndVerifyStatusIsOk(String url) throws IOException {
        HttpUriRequest request = new HttpGet(url);

        HttpResponse response = httpClient.execute(request);
        int statusCode = response.getStatusLine().getStatusCode();

        assert statusCode == 200;
    }
}

ধন্যবাদ! শুধু এই উত্তরের TrustAllStrategy.INSTANCEসাথে পরিবর্তন করুন TrustSelfSignedStrategy.INSTANCE
পার্সি ভেগা

এটি আমার পক্ষে কার্যকর হয়নি। javax.net.ssl.SSLHandshakeException: sun.security. লাডিয়েটার.ভালিডেটর এক্সপেশন: পিকেএক্স পাথ বিল্ডিং ব্যর্থ হয়েছে: সূর্য.সিকিউরিটি।
Provider.certpath.SunCertPathBuilderException:

26

রেকর্ডের জন্য, 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();

3
HttpClient 4.4 জন্য ঊর্ধ্বমুখী, আপনি এই যা করতে হবে - এবং এছাড়াও একটি তৈরি করার প্রয়োজন হতে পারে SSLConnectionSocketFactoryযে ব্যবহার SSLContext, এবং একটি মধ্যে এই সংজ্ঞায়িত Registry<ConnectionSocketFactory>, আপনি একটি তৈরি করতে যাচ্ছেন যদি PoolingHttpClientConnectionManager। অন্যান্য উত্তরগুলি আরও জনপ্রিয়, তবে HTTPClient 4.4 এ কাজ করবেন না।
টমাস

1
Httpclient-4.3.5.jar দিয়ে ঠিক এর মতোই কাজ করে।
হ্যারাল্ড

18

অ্যাপাচি এইচটিটিপি ক্লায়েন্ট 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();

এটি আমাদের আসল কার্যকরী বাস্তবায়ন থেকে নেওয়া হয়েছে।

অন্যান্য উত্তরগুলি জনপ্রিয়, তবে HTTPClient 4.4 এর জন্য তারা কাজ করে না। আমি সম্ভাবনাগুলি ক্লান্ত করার চেষ্টা ও ক্লান্তিকর সময় কাটিয়েছি, তবে 4.4 এ অত্যন্ত বড় এপিআই পরিবর্তন এবং স্থানান্তর হয়েছে বলে মনে হচ্ছে।

একটি সামান্য পূর্ণাঙ্গ ব্যাখ্যা এখানে দেখুন: http://literatejava.com/networks/ignore-ssl-certificate-erferences-apache-httpclient-4-4/

আশা করি এইটি কাজ করবে!


2
আমি যে SSLContext বিট প্রয়োজন ছিল। এতটা বাধ্য।
মিটুনআপ

14

যদি আপনি যা করতে চান তা যদি অবৈধ হোস্টনাম ত্রুটিগুলি থেকে মুক্তি পায় তবে আপনি কেবল এটি করতে পারেন:

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

8
Sf.setHostnameVerifier পদ্ধতি 4.1 হিসাবে অবচয় করা হয়েছে। বিকল্পটি হল একটি কনস্ট্রাক্টর ব্যবহার করা। উদাহরণস্বরূপ:SSLSocketFactory sf = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
কালিয়াটেক

লিগ্যাসি কোডটি যখন আমাকে মোকাবেলা করতে হয়েছিল তখন এটি খুব কার্যকর হয়েছিল।
ডানকানসংডাব্লিউ কিম

9

আমরা 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);

আপনার অনুরোধটি সাধারণ আকারে চালিয়ে যান


7

সাবলীল সাড়ে ৪.২.২ সহ এটির কাজ করতে আমাকে নিম্নলিখিত পরিবর্তন করতে হয়েছিল।

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) {
    }

1
এটি আমার জন্য কাজ করা একমাত্র সমাধান। আমি 4.5 এ আপগ্রেড করার আগে এবং এটি চেষ্টা করার আগে উপরের সমাধানগুলি 4.3 এবং 4.4 এর জন্য চেষ্টা করেছি।
dirkoneill

6

এইভাবে আমি এটি করেছি -

  1. আমার নিজস্ব মকএসএসএলএসকেট ফ্যাক্টরি তৈরি করুন (ক্লাসটি নীচে সংযুক্ত)
  2. এটি ডিফল্ট HTTPClient শুরু করার জন্য ব্যবহার করুন। প্রক্সি ব্যবহার করা হলে প্রক্সি সেটিংস সরবরাহ করা দরকার।

ডিফল্ট এইচটিটিপি ক্লায়েন্ট শুরু করা হচ্ছে -

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

আপনি যদি ভবিষ্যতে আমদানিগুলি অন্তর্ভুক্ত করেন তবে এটি সহায়তা করবে। দুটি ভিন্ন ক্লাস আছে।
অ্যান্ড্রয়েড ডেভ

4

এক্সটেনশানটিকে সালে ZZ এর সংকেতপদ্ধতিরচয়িতা এর উত্তর এটা hostnameverifier ওভাররাইড সুন্দর হতে হবে।

// ...
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 {
    }
});
// ...

আপনি কেবল এটি করে অর্জন করতে পারেনsf.setHostnameVerifier(new AllowAllHostnameVerifier());
ড্যান ডায়ার

7
Sf.setHostnameVerifier 4.1 হিসাবে অবচিত করা হয়েছে। বিকল্পটি হল একটি কনস্ট্রাক্টর ব্যবহার করা। উদাহরণস্বরূপ:SSLSocketFactory sf = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
কালিয়াটেক

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

4

HTTPClient 4.4.x এ সমস্ত শংসাপত্র গ্রহণ করতে আপনি এইচটিসিপিএলেন্ট তৈরি করার সময় নিম্নলিখিত একটি লাইনার ব্যবহার করতে পারেন:

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

আমি এটি পাচ্ছি: কারণ: javax.net.ssl.SSLHandshakeException: জাভা.সিকিউরিটি.সেসার্ট.সর্পরিটি এক্সেক্সেশন: কোন বিষয়ের বিকল্প নাম উপস্থিত নেই?

এইচটিটিপিপ্লায়েন্ট এপিআই বা রেস্টক্লিয়েন্ট এপিআইতে কোনও শংসাপত্র ছাড়াই এসএসএল সাইটগুলিতে সংযোগগুলি কীভাবে অনুমতি দেবেন?

4

ফ্লুয়েন্ট এপিআই এর সাথে এইচটিপিপ্লিনেন্ট 4.5.5 এর সাথে পরীক্ষিত

final SSLContext sslContext = new SSLContextBuilder()
    .loadTrustMaterial(null, (x509CertChain, authType) -> true).build();

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

String result = Executor.newInstance(httpClient)
    .execute(Request.Get("https://localhost:8080/someapi")
    .connectTimeout(1000).socketTimeout(1000))
    .returnContent().asString();

3

নীচে কোড সহ কাজ করে 4.5.5

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

class HttpsSSLClient {


    public static CloseableHttpClient createSSLInsecureClient() {
        SSLContext sslcontext = createSSLContext();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new HostnameVerifier() {

            @Override
            public boolean verify(String paramString, SSLSession paramSSLSession) {
                return true;
            }
        });
        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        return httpclient;
    }


    private static SSLContext createSSLContext() {
        SSLContext sslcontext = null;
        try {
            sslcontext = SSLContext.getInstance("TLS");
            sslcontext.init(null, new TrustManager[] {new TrustAnyTrustManager()}, new SecureRandom());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
        return sslcontext;
    }


    private static class TrustAnyTrustManager implements X509TrustManager {

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

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

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

}
public class TestMe {


    public static void main(String[] args) throws IOException {
        CloseableHttpClient client = HttpsSSLClient.createSSLInsecureClient();

        CloseableHttpResponse res = client.execute(new HttpGet("https://wrong.host.badssl.com/"));
        System.out.println(EntityUtils.toString(res.getEntity()));
    }
}

কোড থেকে আউটপুট হয়

কোড

ব্রাউজারে আউটপুট হয়

খারাপ এসএসএল

ব্যবহৃত পোম নীচে রয়েছে

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tarun</groupId>
    <artifactId>testing</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>6</source>
                    <target>6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.5</version>
    </dependency>

</dependencies>
</project>

আপডেট হওয়া উত্তরের জন্য ধন্যবাদ, আমি নতুন লোকটিকে "স্বাগত" হতে অনুগ্রহ করেছিলাম তবে আমি সবার জন্য আপডেট উত্তর চাই!

1
নিবন্ধন করুন আমি তাকেও উজ্জীবিত করেছি :-)
তরুণ লালওয়ানি

2

অ্যাপাচি এইচটিপিপ্লিনেন্ট ৪.১.৩ (উপরে ওলেগের কোডের উপর ভিত্তি করে, তবে এটির জন্য এখনও আমার সিস্টেমে একটি অনুমতি_ সমস্ত_হোস্টনাম_সিডিভার প্রয়োজন): এর সম্পূর্ণ কাজের সংস্করণ:

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

দ্রষ্টব্য আমি সমস্ত ব্যতিক্রম পুনরায় নিক্ষেপ করছি কারণ সত্যই, এর মধ্যে যদি কোনও আসল সিস্টেমে ব্যর্থ হয় তবে আমি বেশি কিছু করতে পারি না!


2

আপনি যদি সাবলীল এপিআই ব্যবহার করে থাকেন তবে আপনাকে এটির মাধ্যমে সেট আপ করতে হবে Executor:

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

... জেডজেডsslContext কোডারের উত্তরে দেখানো হয়েছে যেখানে এসএসএল কনটেক্সট তৈরি করা হয়েছে ।

এর পরে, আপনি আপনার http অনুরোধগুলি এইভাবে করতে পারেন:

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

দ্রষ্টব্য: এইচটিটিপিপ্লায়েন্ট ৪.২ দিয়ে পরীক্ষিত


দুর্ভাগ্যক্রমে ৪.৩-এ অবনতিহীন: "অবহেলিত। (৪.৩) ব্যবহার করবেন না।"
এসটিএম

2

৪.৩.৩ নিয়ে পরীক্ষা করা হয়েছে

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

}


আমি এটি করতে চাইলে কীভাবে মানসমূহ সেট করতে হয়?

2

4.5.4 এ পরীক্ষিত:

            SSLContext sslContext = new SSLContextBuilder()
                    .loadTrustMaterial(null, (TrustStrategy) (arg0, arg1) -> true).build();

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

0

অ্যামাজনএস 3 ক্লায়েন্ট ব্যবহার করার সময় আপনি যদি এই সমস্যার মুখোমুখি হন, যা অ্যাপাচি এইচটিটিপিপ্লায়েন্ট ৪.১ এম্বেড করে, আপনার কেবলমাত্র এই জাতীয় সিস্টেমের সংজ্ঞা দিতে হবে যাতে এসএসএল সার্ট পরীক্ষককে শিথিল করা যায়:

-Dcom.amazonaws.sdk.disableCertChecking = সত্য

দুষ্কর্ম পরিচালিত


0

fww, একটি বিশেষ "ট্রাস্ট অলস" ক্লায়েন্ট তৈরি করতে JAX-RS 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> 

-1

যদি আপনি অ্যাপাচি httpClient 4.5.x ব্যবহার করেন তবে এটি চেষ্টা করুন:

public static void main(String... args)  {

    try (CloseableHttpClient httpclient = createAcceptSelfSignedCertificateClient()) {
        HttpGet httpget = new HttpGet("https://example.com");
        System.out.println("Executing request " + httpget.getRequestLine());

        httpclient.execute(httpget);
        System.out.println("----------------------------------------");
    } catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException | IOException e) {
        throw new RuntimeException(e);
    }
}

private static CloseableHttpClient createAcceptSelfSignedCertificateClient()
        throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {

    // use the TrustSelfSignedStrategy to allow Self Signed Certificates
    SSLContext sslContext = SSLContextBuilder
            .create()
            .loadTrustMaterial(new TrustSelfSignedStrategy())
            .build();

    // we can optionally disable hostname verification. 
    // if you don't want to further weaken the security, you don't have to include this.
    HostnameVerifier allowAllHosts = new NoopHostnameVerifier();

    // create an SSL Socket Factory to use the SSLContext with the trust self signed certificate strategy
    // and allow all hosts verifier.
    SSLConnectionSocketFactory connectionFactory = new SSLConnectionSocketFactory(sslContext, allowAllHosts);

    // finally create the HttpClient using HttpClient factory methods and assign the ssl socket factory
    return HttpClients
            .custom()
            .setSSLSocketFactory(connectionFactory)
            .build();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.