এইচটিপিএস সংযোগ অ্যান্ড্রয়েড


101

আমি একটি https পোস্ট করছি এবং আমি এসএসএল ব্যতিক্রম বিশ্বস্ত সার্ভার শংসাপত্রের ব্যতিক্রম পাচ্ছি। আমি যদি সাধারণ HTTP করি তবে এটি পুরোপুরি ঠিক আছে। আমাকে কি কোনওভাবে সার্ভার শংসাপত্র গ্রহণ করতে হবে?


আমি কি এর কিছু নমুনা বাস্তবায়ন পেতে পারি
Sam97305421562

এই থ্রেডটি সহায়তা করতে পারে, তবে আমি এটি বলতে পারি না এটি কার্যকর হয় কিনা তা সর্বশেষ এপিআই: groups.google.com/group/android-developers/browse_thread/thread/…
আরজেআর

উত্তর:


45

আমি অনুমান করছি, তবে আপনি যদি সত্যিকারের হ্যান্ডশেকটি ঘটতে চান তবে আপনাকে অ্যান্ড্রয়েডকে আপনার শংসাপত্র সম্পর্কে জানাতে হবে। যদি আপনি কেবল যে কোনও বিষয়ই মেনে নিতে চান তবে অ্যাপাচি এইচটিটিপি ক্লায়েন্টের সাথে আপনার যা প্রয়োজন তা পেতে এই সিডো কোডটি ব্যবহার করুন:

SchemeRegistry schemeRegistry = new SchemeRegistry ();

schemeRegistry.register (new Scheme ("http",
    PlainSocketFactory.getSocketFactory (), 80));
schemeRegistry.register (new Scheme ("https",
    new CustomSSLSocketFactory (), 443));

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager (
    params, schemeRegistry);


return new DefaultHttpClient (cm, params);

কাস্টম এসএসএলসকেট ফ্যাক্টরি:

public class CustomSSLSocketFactory extends org.apache.http.conn.ssl.SSLSocketFactory
{
private SSLSocketFactory FACTORY = HttpsURLConnection.getDefaultSSLSocketFactory ();

public CustomSSLSocketFactory ()
    {
    super(null);
    try
        {
        SSLContext context = SSLContext.getInstance ("TLS");
        TrustManager[] tm = new TrustManager[] { new FullX509TrustManager () };
        context.init (null, tm, new SecureRandom ());

        FACTORY = context.getSocketFactory ();
        }
    catch (Exception e)
        {
        e.printStackTrace();
        }
    }

public Socket createSocket() throws IOException
{
    return FACTORY.createSocket();
}

 // TODO: add other methods like createSocket() and getDefaultCipherSuites().
 // Hint: they all just make a call to member FACTORY 
}

ফুলএক্স 509 ট্রাস্টম্যানেজার এমন একটি শ্রেণি যা javax.net.ssl.X509TrustManager প্রয়োগ করে, তবুও কোনও পদ্ধতিই আসলে কোনও কাজ সম্পাদন করে না, এখানে একটি নমুনা পান ।

শুভকামনা!


ফ্যাক্টরি ভেরিয়েবল কেন আছে ??
কোডভলে

4
FACTORY.createSket () ফিরিয়ে দিন; সমস্যা হচ্ছে তৈরি করা সকেট এক্সিকিউট () চালানোর ক্ষেত্রে নাল পয়েন্টার ব্যতিক্রম দিচ্ছে। এছাড়াও, আমি লক্ষ করেছি, এখানে 2 সকেটফ্যাক্টরি ক্লাস রয়েছে। 1. org.apache.http.conn.ssl.SSLSketF কারখানা এবং 2. javax.net.ssl.SSLSketFactory
কোডভেলি

4
হাই নাট, এটিকে আমার পরিস্থিতির জন্য কিছু সহায়ক বলে মনে হচ্ছে। তবে, কাস্টমএসএসএলসকেটফ্যাক্টরি তৈরি করতে আমার কিছু সমস্যা হচ্ছে। এটি কোন শ্রেণিটি বাড়ানোর কথা? বা কোন ইন্টারফেসটি এটি প্রয়োগ করার কথা? আমি পরীক্ষিত হয়েছি: javax.net.SocketFactory, javax.net.ssl.SSLSketFactory, org.apache.http.conn.scheme.SketF কারখানার, যার সবকটিই অন্যান্য পদ্ধতির প্রয়োগকে বাধ্য করে ... সুতরাং, সাধারণভাবে, কী আপনার কোডে ক্লাসের নামের স্থানগুলি ব্যবহৃত হচ্ছে? ধন্যবাদ. :)
সিফ্রন

4
আমার জন্য কাজ করে না, আমাকে একই বিশ্বস্ত সার্ভার শংসাপত্র ত্রুটি দেয়।
ওমর রেহমান

4
আমি এই ক্লাসটি কীভাবে পেতে পারিFullX509TrustManager
রাজা রেডি পোলাম রেডি

89

আমি এই কি করছি। এটি কেবল শংসাপত্রটি আর পরীক্ষা করে না।

// always verify the host - dont check for certificate
final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
};

/**
 * Trust every server - dont check for any certificate
 */
private static void trustAllHosts() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[] {};
        }

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

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

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection
                .setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

এবং

    HttpURLConnection http = null;

    if (url.getProtocol().toLowerCase().equals("https")) {
        trustAllHosts();
        HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
        https.setHostnameVerifier(DO_NOT_VERIFY);
        http = https;
    } else {
        http = (HttpURLConnection) url.openConnection();
    }

এই ভাল লাগছে! আমি যাইহোক, ওয়েবভিউ ব্যবহার করছি এবং কেবল পরীক্ষার উদ্দেশ্যে https সার্ভারের সাথে সংযোগ স্থাপন করা দরকার। (ক্লায়েন্ট কোনও মিলে যাওয়া এফকিউডিএন দিয়ে একটি সরবরাহ করতে পারে না, বা তারা HTTP এ পরীক্ষা করতে পারে না)) ওয়েবউইউ ব্যবহার করার সময় এটিকে মোকাবেলার কোনও উপায় আছে কি? ওয়েবভিউ রয়েছে এমন ক্রিয়াকলাপে আমি কী এই কোডটি ফেলেছি এবং "এটি কেবল কাজ করে?" (সন্দেহজনক নয়… ??)
জো

আমি সেই পদক্ষেপটি ধাপে ধাপে ব্যবহার করার চেষ্টা করছি এবং আমি এরকম ব্যতিক্রম পাচ্ছি: 07-25 12: 35: 25.941: WARN / System.err (24383): java.lang.ClassCastException: org.apache.harmon.luni .intern.net.www.protocol.http.HttpURL সংযোগটি এমন জায়গায় যেখানে আমি সংযোগ খোলার চেষ্টা করছি ... কোনও ধারণা কেন ??
রবার্ট

4
আরে আমি আপনার পরামর্শ মতো করেছিলাম তবে আমি ব্যতিক্রম পাচ্ছি javax.net.ssl.SSLException: Received fatal alert: bad_record_mac। আমি এর TLSসাথে প্রতিস্থাপনের চেষ্টা করেছি SSLকিন্তু এটি কোনও লাভ হয়নি। দয়া করে আমাকে সাহায্য করুন, ধন্যবাদ
দেবস্রি

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

4
আপনার এই কোডটি সুপারিশ বা পোস্ট করা উচিত নয়। এটি মূলত নিরাপত্তাহীন। আপনার আসল সমস্যাটি সমাধান করা উচিত।
লার্নের মারকুইস

33

এই প্রশ্নের উত্তর দেওয়ার চেষ্টা করার সময় আমি একটি আরও ভাল টিউটোরিয়াল পেয়েছি। এটির সাথে আপনাকে শংসাপত্রের চেক আপস করতে হবে না।

http://blog.crazybob.org/2010/02/android-trusting-ssl-cerર્ટates.html

* আমি এটি লিখিনি তবে কাজের জন্য বব লিকে ধন্যবাদ


4
এটি সঠিক উত্তর। আমি একটি আপডেট পোস্ট তৈরি করেছি যা দেখায় যে নন তালিকাভুক্ত সিএ'র সাথে কীভাবে व्यवहार করতে হয় কারণ আমি একটি পিয়ার সার্টিফেট ত্রুটি পাচ্ছিলাম। এটি এখানে দেখুন: blog.donnfelker.com/2011/06/13/…
ডন

6

আপনি আমার ব্লগ নিবন্ধটিও দেখতে পারেন, ক্রেজিববসের সাথে খুব মিল।

এই সমাধানটি শংসাপত্র পরীক্ষার সাথেও আপস করে না এবং কীভাবে আপনার নিজের কীস্টোরে বিশ্বস্ত শংসাপত্রগুলি যুক্ত করবেন তা ব্যাখ্যা করে।

http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-cerર્ટates/


4

http://madurangasblogs.blogspot.in/2013/08/avoiding-javaxnetsslsslpeerunverifiedex.html

সৌজন্যে মদুরঙ্গ

Https ব্যবহার করে এমন কোনও অ্যাপ্লিকেশন বিকাশ করার সময়, আপনার পরীক্ষার সার্ভারের কোনও বৈধ SSL শংসাপত্র নেই। বা কখনও কখনও ওয়েবসাইটটি স্ব-স্বাক্ষরিত শংসাপত্র ব্যবহার করে বা ওয়েব সাইটটি বিনামূল্যে এসএসএল শংসাপত্র ব্যবহার করে। সুতরাং আপনি যদি অ্যাপাচি ব্যবহার করে সার্ভারের সাথে সংযোগ স্থাপনের চেষ্টা করেন HttpClient, আপনি "পিয়ারটি অনুমোদনপ্রাপ্ত নয়" বলে একটি ব্যতিক্রম পাবেন। যদিও কোনও প্রোডাকশন সফ্টওয়্যারটিতে সমস্ত শংসাপত্রের উপর বিশ্বাস রাখা ভাল অনুশীলন না হলেও পরিস্থিতি অনুযায়ী আপনাকে এটি করতে হতে পারে। এই সমাধানটি "পিয়ার প্রমাণীকরণযোগ্য নয়" এর কারণে ঘটে যাওয়া ব্যতিক্রমগুলি সমাধান করে।

তবে সমাধানে যাওয়ার আগে, আপনাকে অবশ্যই সতর্ক করতে হবে যে এটি কোনও প্রোডাকশন অ্যাপ্লিকেশনটির জন্য ভাল ধারণা নয়। এটি সুরক্ষা শংসাপত্র ব্যবহারের উদ্দেশ্য লঙ্ঘন করবে। সুতরাং আপনার যদি কোনও ভাল কারণ না থাকে বা আপনি যদি নিশ্চিত হন যে এটি কোনও সমস্যা তৈরি করে না, তবে এই সমাধানটি ব্যবহার করবেন না।

সাধারণত আপনি এটি তৈরি করেন HttpClient

HttpClient httpclient = new DefaultHttpClient();

তবে আপনি এইচটিটিপিপ্লায়েন্ট তৈরির উপায়টি পরিবর্তন করতে হবে।

প্রথমে আপনাকে একটি বর্ধিত শ্রেণি তৈরি করতে হবে org.apache.http.conn.ssl.SSLSocketFactory

import org.apache.http.conn.ssl.SSLSocketFactory;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

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

public class MySSLSocketFactory extends SSLSocketFactory {
         SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
        super(truststore);

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

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

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

তারপরে এভাবে একটি পদ্ধতি তৈরি করুন।

public HttpClient getNewHttpClient() {
     try {
         KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
         trustStore.load(null, null);

         SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
         sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

         HttpParams params = new BasicHttpParams();
         HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
         HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

         SchemeRegistry registry = new SchemeRegistry();
         registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
         registry.register(new Scheme("https", sf, 443));

         ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

         return new DefaultHttpClient(ccm, params);
     } catch (Exception e) {
         return new DefaultHttpClient();
     }
}

তারপরে আপনি এটি তৈরি করতে পারেন HttpClient

HttpClient httpclient = getNewHttpClient();

আপনি যদি কোনও লগইন পৃষ্ঠায় একটি পোস্ট অনুরোধ প্রেরণ করার চেষ্টা করছেন তবে বাকী কোডটি এই জাতীয় হবে।

private URI url = new URI("url of the action of the form");
HttpPost httppost =  new HttpPost(url);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
nameValuePairs.add(new BasicNameValuePair("username", "user"));  
nameValuePairs.add(new BasicNameValuePair("password", "password"));
try {
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    InputStream is = entity.getContent();
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

আপনি ইনপুটস্ট্রিমে এইচটিএমএল পৃষ্ঠা পাবেন। তারপরে আপনি ফিরে আসা এইচটিএমএল পৃষ্ঠা দিয়ে যা খুশি করতে পারেন।

তবে এখানে আপনি সমস্যার মুখোমুখি হবেন। আপনি যদি কুকিগুলি ব্যবহার করে কোনও সেশন পরিচালনা করতে চান তবে আপনি এই পদ্ধতিটি সহ এটি করতে সক্ষম হবেন না। আপনি যদি কুকিগুলি পেতে চান তবে আপনাকে এটি ব্রাউজারের মাধ্যমে করতে হবে। তাহলেই আপনি কুকিজ পাবেন receive


3

আপনি যদি স্টার্টএসএল বা থাওতে শংসাপত্র ব্যবহার করেন তবে এটি ফ্রিও এবং পুরানো সংস্করণের জন্য ব্যর্থ হবে। আপনি প্রতিটি শংসাপত্রকে বিশ্বাস না করে নতুন সংস্করণের ক্যাসেটের সংগ্রহশালা ব্যবহার করতে পারেন ।


2

2

এই উত্তরগুলির কোনও আমার পক্ষে কার্যকর হয়নি তাই এখানে এমন কোড যা কোনও শংসাপত্রকে বিশ্বাস করে।

import java.io.IOException;

    import java.net.Socket;
    import java.security.KeyManagementException;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.UnrecoverableKeyException;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;

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

    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.conn.scheme.PlainSocketFactory;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.scheme.SchemeRegistry;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.conn.ssl.X509HostnameVerifier;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
    import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

    public class HttpsClientBuilder {
        public static DefaultHttpClient getBelieverHttpsClient() {

            DefaultHttpClient client = null;

            SchemeRegistry Current_Scheme = new SchemeRegistry();
            Current_Scheme.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            try {
                Current_Scheme.register(new Scheme("https", new Naive_SSLSocketFactory(), 8443));
            } catch (KeyManagementException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnrecoverableKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (KeyStoreException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            HttpParams Current_Params = new BasicHttpParams();
            int timeoutConnection = 8000;
            HttpConnectionParams.setConnectionTimeout(Current_Params, timeoutConnection);
            int timeoutSocket = 10000;
            HttpConnectionParams.setSoTimeout(Current_Params, timeoutSocket);
            ThreadSafeClientConnManager Current_Manager = new ThreadSafeClientConnManager(Current_Params, Current_Scheme);
            client = new DefaultHttpClient(Current_Manager, Current_Params);
            //HttpPost httpPost = new HttpPost(url);
            //client.execute(httpPost);

         return client;
         }

    public static class Naive_SSLSocketFactory extends SSLSocketFactory
    {
        protected SSLContext Cur_SSL_Context = SSLContext.getInstance("TLS");

        public Naive_SSLSocketFactory ()
                throws NoSuchAlgorithmException, KeyManagementException,
                KeyStoreException, UnrecoverableKeyException
        {
            super(null, null, null, null, null, (X509HostnameVerifier)null);
            Cur_SSL_Context.init(null, new TrustManager[] { new X509_Trust_Manager() }, null);
        }

        @Override
        public Socket createSocket(Socket socket, String host, int port,
                boolean autoClose) throws IOException
        {
            return Cur_SSL_Context.getSocketFactory().createSocket(socket, host, port, autoClose);
        }

        @Override
        public Socket createSocket() throws IOException
        {
            return Cur_SSL_Context.getSocketFactory().createSocket();
        }
    }

    private static class X509_Trust_Manager implements X509TrustManager
    {

        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            // TODO Auto-generated method stub

        }

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            // TODO Auto-generated method stub

        }

        public X509Certificate[] getAcceptedIssuers() {
            // TODO Auto-generated method stub
            return null;
        }

    };
}

এই কোডটি ইউআরএল প্যাটার্নের সাথে সূক্ষ্মভাবে কাজ করে - লোকালহোস্ট: ৮৪৪৪ / ওয়েবপ্রোজেক্ট / ইয়োর সার্ভিস
স্পিটি

কনস্ট্রাক্টর এসএসএলসকেটফ্যাক্টরি (নাল, নাল, নাল, নাল, নাল, এক্স 509 হোস্টনাম ভেরিফায়ার) অপরিজ্ঞাত
মিশাল

1

আমি এসএসএল শংসাপত্রগুলির জন্য অ্যান্ড্রয়েড সুনির্দিষ্ট সম্পর্কে জানি না, তবে এটি বোধগম্য হবে যে অ্যান্ড্রয়েড ব্যাট থেকে স্ব স্বাক্ষরিত এসএসএল শংসাপত্র গ্রহণ করবে না। আমি অ্যান্ড্রয়েড ফোরামগুলি থেকে এই পোস্টটি পেয়েছি যা দেখে মনে হচ্ছে একই সমস্যা: http://androidforums.com/android-applications/950-imap-self-sided-ssl-certificates.html


যেমন আমি বলেছিলাম আমি অ্যান্ড্রয়েডের বিশেষ বিবরণগুলি জানি না তবে আমি আজকের দিনটি আপনাকে প্ল্যাটফর্মটি বলতে হবে যে আপনি যে সার্ভারে সংযোগ করছেন তার এসএসএল শংসাপত্রটি কী। যদি আপনি কোনও স্বাক্ষরিত সার্টিফিকেট ব্যবহার করেন যা প্ল্যাটফর্মের দ্বারা স্বীকৃত নয়। এসএসএল সার্টিফিকেট শ্রেণি সম্ভবত সহায়ক হবে: বিকাশকারী.অ্যান্ড্রয়েড / রেফারেন্স / অ্যান্ড্রয়েড / নেট / এইচটিপি / more আমার আরও সময় পেলে আমি আজ এটি পরে খনন করব।
মট্টি লীরা

1

এটি অ্যান্ড্রয়েড 2.x এর একটি পরিচিত সমস্যা। আমি নীচের প্রশ্নটি না আসা পর্যন্ত আমি এই সমস্যাটির সাথে এক সপ্তাহ ধরে লড়াই করে যাচ্ছিলাম, যা কেবল সমস্যার ভাল পটভূমিই দেয় না তবে কোনও সুরক্ষা গর্ত ছাড়াই একটি কার্যকর এবং কার্যকর সমাধান সরবরাহ করে।

অ্যান্ড্রয়েড ২.৩-তে 'পিয়ার শংসাপত্রের ত্রুটি নেই' তবে 4-এ নয়


0

কিছু কারণে উপরে httpClient এর জন্য উল্লিখিত সমাধানটি আমার পক্ষে কাজ করে নি। শেষে আমি কাস্টম এসএসএসকেটফ্যাক্টরি ক্লাস বাস্তবায়নের সময় পদ্ধতিটিকে সঠিকভাবে ওভাররাইড করে এটিকে কাজ করতে সক্ষম করেছিলাম।

@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) 
                              throws IOException, UnknownHostException 
    {
    return sslFactory.createSocket(socket, host, port, autoClose);
}

@Override
public Socket createSocket() throws IOException {
    return sslFactory.createSocket();
}

এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছিল। আপনি সম্পূর্ণ কাস্টম ক্লাস এবং নিম্নলিখিত থ্রেডে প্রয়োগ করতে পারবেন: http://blog.syedgakbar.com/2012/07/21/android-https-and-not-trusted-server-certificate-error/


0

আমি এই ক্লাস তৈরি এবং খুঁজে পেয়েছি

package com.example.fakessl;

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.SSLSession;
import javax.net.ssl.TrustManager;

import android.util.Log;

public class CertificadoAceptar {
    private static TrustManager[] trustManagers;

    public static class _FakeX509TrustManager implements
            javax.net.ssl.X509TrustManager {
        private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};

        public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }

        public boolean isClientTrusted(X509Certificate[] chain) {
            return (true);
        }

        public boolean isServerTrusted(X509Certificate[] chain) {
            return (true);
        }

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

    public static void allowAllSSL() {

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

        javax.net.ssl.SSLContext context = null;

        if (trustManagers == null) {
            trustManagers = new javax.net.ssl.TrustManager[] { new _FakeX509TrustManager() };
        }

        try {
            context = javax.net.ssl.SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
        } catch (NoSuchAlgorithmException e) {
            Log.e("allowAllSSL", e.toString());
        } catch (KeyManagementException e) {
            Log.e("allowAllSSL", e.toString());
        }
        javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context
                .getSocketFactory());
    }
}

আপনার কোড সাদা

CertificadoAceptar ca = new CertificadoAceptar();
ca.allowAllSSL();
HttpsTransportSE Transport = new HttpsTransportSE("iphost or host name", 8080, "/WS/wsexample.asmx?WSDL", 30000);

0

যে সূত্রগুলি আমাকে আমার এডাব্লুএস অ্যাপাচি সার্ভারে স্ব স্বাক্ষরিত শংসাপত্রের সাথে কাজ করতে এবং অ্যান্ড্রয়েড ডিভাইস থেকে এইচটিপিআরএল সংযোগের সাথে সংযুক্ত হতে সহায়তা করেছে: দ্য

উদাহরণস্বরূপ
এসএসএল - এইচটিটিপিএস এবং এসএসএল এর সাথে এসএসএল অ্যান্ড্রয়েড সুরক্ষা সম্পর্কে অ্যামাজন টিউটোরিয়াল - গ্রাহককে স্বীকার করার জন্য নিজের বিশ্বাস ম্যানেজার তৈরি করতে আপনার শংসাপত্র
স্ব স্বাক্ষরিত শংসাপত্র তৈরি করা - আপনার শংসাপত্রগুলি তৈরি করার জন্য সহজ স্ক্রিপ্ট

তারপরে আমি নিম্নলিখিতগুলি করেছি:

  1. নিশ্চিত হয়ে নিন যে সার্ভারটি https সমর্থন করে (sudo yum ইনস্টল -y Mod24_ssl)
  2. এই স্ক্রিপ্টটি একটি ফাইলে রাখুন create_my_certs.sh:
#!/bin/bash
FQDN=$1

# make directories to work from
mkdir -p server/ client/ all/

# Create your very own Root Certificate Authority
openssl genrsa \
  -out all/my-private-root-ca.privkey.pem \
  2048

# Self-sign your Root Certificate Authority
# Since this is private, the details can be as bogus as you like
openssl req \
  -x509 \
  -new \
  -nodes \
  -key all/my-private-root-ca.privkey.pem \
  -days 1024 \
  -out all/my-private-root-ca.cert.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"

# Create a Device Certificate for each domain,
# such as example.com, *.example.com, awesome.example.com
# NOTE: You MUST match CN to the domain name or ip address you want to use
openssl genrsa \
  -out all/privkey.pem \
  2048

# Create a request from your Device, which your Root CA will sign
openssl req -new \
  -key all/privkey.pem \
  -out all/csr.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"

# Sign the request from Device with your Root CA
openssl x509 \
  -req -in all/csr.pem \
  -CA all/my-private-root-ca.cert.pem \
  -CAkey all/my-private-root-ca.privkey.pem \
  -CAcreateserial \
  -out all/cert.pem \
  -days 500

# Put things in their proper place
rsync -a all/{privkey,cert}.pem server/
cat all/cert.pem > server/fullchain.pem         # we have no intermediates in this case
rsync -a all/my-private-root-ca.cert.pem server/
rsync -a all/my-private-root-ca.cert.pem client/
  1. চালান bash create_my_certs.sh yourdomain.com
  2. শংসাপত্রগুলি তাদের যথাযথ স্থানে সার্ভারে রাখুন (আপনি /etc/httpd/conf.d/ssl.conf এ কনফিগারেশন পেতে পারেন)। এই সমস্ত সেট করা উচিত:
    এসএসএল
    সার্টিফিটফিল এসএসএল সার্টিফিকেটকি ফাইলে
    SSLCertificateChainFile
    SSLCACertificateFile

  3. Httpd ব্যবহার করে পুনঃসূচনা করুন sudo service httpd restartএবং নিশ্চিত করুন যে httpd শুরু হয়েছে:
    httpd থামানো হচ্ছে: [ঠিক আছে]
    httpd শুরু করা: [ঠিক আছে]

  4. কপি my-private-root-ca.certআপনার অ্যান্ড্রয়েড প্রকল্প সম্পদ ফোল্ডারে

  5. আপনার বিশ্বাস পরিচালক তৈরি করুন:

    SSLContext SSLContext;

    সার্টিফিকেটফ্যাক্টরি সিএফ = সার্টিফিকেটফ্যাক্টরি.জেটআইনস্ট্যান্স ("X.509"); ইনপুট স্ট্রিম caInput = প্রসঙ্গ। শংসাপত্র সিএ; চেষ্টা করুন {সিএ = সিএফ.জেনারেট সার্টিফিকেট (সিআইএনপুট); } অবশেষে {caInput.close (); }

      // Create a KeyStore containing our trusted CAs
      String keyStoreType = KeyStore.getDefaultType();
      KeyStore keyStore = KeyStore.getInstance(keyStoreType);
      keyStore.load(null, null);
      keyStore.setCertificateEntry("ca", ca);
    
      // Create a TrustManager that trusts the CAs in our KeyStore
      String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
      tmf.init(keyStore);
    
      // Create an SSLContext that uses our TrustManager
      SSLContext = SSLContext.getInstance("TLS");
      SSSLContext.init(null, tmf.getTrustManagers(), null);
    
  6. এবং এইচটিটিপিএসর URL সংযোগ ব্যবহার করে সংযোগটি তৈরি করুন:

    এইচটিসিপিআরএলস কানেকশন সংযোগ = (এইচটিসিপিআরএলস সংযোগ) url.openConnection (); সংযোগ.সেটএসএলএসকেটফ্যাক্টরি (এসএসএল কনটেক্সট.জেটসকেটফ্যাক্টরি ());

  7. এটি স্থায়ী, আপনার https সংযোগ চেষ্টা করুন।


0

সম্ভবত আপনি এরকম কিছু চেষ্টা করতে পারেন। এটি আমাকে সাহায্য করেছিল

    SslContextFactory sec = new SslContextFactory();
    sec.setValidateCerts(false);
    sec.setTrustAll(true);

    org.eclipse.jetty.websocket.client.WebSocketClient client = new WebSocketClient(sec);

-1

আপনার এইচটিটিপি ক্লায়েন্ট হিসাবে কেবল এই পদ্ধতিটি ব্যবহার করুন:

public static  HttpClient getNewHttpClient() {
    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);

        SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
        sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", sf, 443));

        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

        return new DefaultHttpClient(ccm, params);
    } catch (Exception e) {
        return new DefaultHttpClient();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.