অ্যান্ড্রয়েড এসএসএল সংযোগের জন্য ট্রাস্ট অ্যাঙ্কর পাওয়া যায় নি


185

আমি একটি আইআইএস 6 বাক্সে একটি গডাডি 256 বিট এসএসএল শংসাপত্রের সাথে সংযোগ স্থাপনের চেষ্টা করছি এবং আমি ত্রুটিটি পাচ্ছি:

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

কী কারণ হতে পারে তা নির্ধারণের চেষ্টা করা হয়েছে তবে এখনই ফাঁকা আঁকুন।

এখানে আমি কীভাবে সংযোগ দিচ্ছি:

HttpsURLConnection conn;              
conn = (HttpsURLConnection) (new URL(mURL)).openConnection();
conn.setConnectTimeout(20000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
String tempString = toString(conn.getInputStream()); 

উত্তর:


78

@ ক্রিস্পিক্সের সমাধান বিপজ্জনক! সমস্ত শংসাপত্রের উপর নির্ভর করে যে কেউ মধ্যের আক্রমণে একজনকে করার অনুমতি দেয়! ক্লায়েন্টকে কেবল কোনও শংসাপত্র প্রেরণ করুন এবং এটি এটি গ্রহণ করবে!

এই শুল্কে বর্ণিত যেমন একটি কাস্টম ট্রাস্ট ম্যানেজারে আপনার শংসাপত্র (গুলি) যুক্ত করুন: এইচটিটিপিএস-এর মাধ্যমে এইচটিটিপি ক্লায়েন্ট ব্যবহার করে সমস্ত শংসাপত্রের উপর বিশ্বাস রাখা

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


1
এটি একটি স্ব-উত্পাদিত শংসাপত্রের সাথে কাজ করার জন্য ঠিক আছে, তবে একটির (যেমন ওপি'র) যার মূল বৈধ চেইন রয়েছে তার সিএর জন্য এটি একটি খারাপভাবে কনফিগার করা সার্ভারের জন্য কেবল একটি কাজ - আমার উত্তর দেখুন।
স্টিভি

4
@ স্টেভি প্রতিটি শংসাপত্র গ্রহণ করা ধারণা ধারণার প্রমাণের জন্য কেবল একটি বিকল্প, যেখানে এসএসএল সংযোগটি আপনি যে অংশটি পরীক্ষা করতে চান তা নয়। অন্যথায় আপনাকে এসএসএল ব্যবহার করতে হবে না, যদি আপনি প্রতিটি শংসাপত্র গ্রহণ করেন তবে সংযোগটি নিরাপদ নয়!
ম্যাথিয়াস বি

1
আহা, আমি দুঃখিত, আমি মনে করি একটি ভুল বুঝাবুঝি হয়েছে - আমি সম্পূর্ণরূপে সম্মতি জানাই যে প্রত্যেকের প্রত্যয়নপত্র কারও উচিত গ্রহণ করা উচিত নয়! :) আমার মন্তব্যটি আপনার ২ য় অনুচ্ছেদে সম্পর্কিত ছিল - একটি কাস্টম ট্রাস্ট ম্যানেজার ব্যবহার করার পরামর্শ - যা আইএমএইচও হওয়া উচিত একটি প্রস্তাবিত সমাধানের পরিবর্তে শেষ অবলম্বন হিসাবে কাজ করা।
স্টিভি

2
মাথা উঁচু করে তুলুন .. আমি 'সমাধান' সরিয়ে দিয়েছি যাতে আরও সমস্যা না হওয়ার জন্য আমি একটি ওয়ার্ক-এভার হিসাবে পেস্ট করেছি, কারণ লোকেরা এটিকে 'অস্থায়ী কাজ' হিসাবে দেখেনি as
Chrispix

7
@ ক্রিস্পিক্স, আপনার আংশিক সমাধানটি সরিয়ে নেওয়া উচিত ছিল না, এটি কেবল পরীক্ষার উদ্দেশ্যে পরীক্ষা করা ভাল
হুগো অ্যালেক্সিস কার্ডোনা

224

গৃহীত উত্তরের বিপরীতে আপনার কাস্টম ট্রাস্ট ম্যানেজারের দরকার নেই, আপনার সার্ভার কনফিগারেশনটি ঠিক করতে হবে!

ভুলভাবে ইনস্টলড ডায়ানাডট / আলফাসল শংসাপত্রের সাথে অ্যাপাচি সার্ভারের সাথে সংযোগ করার সময় আমি একই সমস্যার মুখোমুখি হয়েছি। আমি HttpsUrlConnication (জাভা / অ্যান্ড্রয়েড) ব্যবহার করে সংযোগ করছি, যা নিক্ষেপ করছিল -

javax.net.ssl.SSLHandshakeException: 
  java.security.cert.CertPathValidatorException: 
    Trust anchor for certification path not found.

আসল সমস্যাটি হ'ল সার্ভারের ভুল কনফিগারেশন - এটি http://www.digicert.com/help/ বা অনুরূপ দিয়ে পরীক্ষা করুন এবং এটি আপনাকে সমাধানটিও বলবে:

"শংসাপত্রটি কোনও বিশ্বস্ত কর্তৃপক্ষের দ্বারা স্বাক্ষরিত হয়নি (মজিলার মূল স্টোরের বিরুদ্ধে পরীক্ষা করা) you আপনি যদি বিশ্বস্ত কর্তৃপক্ষের কাছ থেকে শংসাপত্রটি কিনে থাকেন তবে আপনার সম্ভবত একটি বা একাধিক ইন্টারমিডিয়েট শংসাপত্র ইনস্টল করা দরকার this এটি করার জন্য সহায়তার জন্য আপনার শংসাপত্র সরবরাহকারীর সাথে যোগাযোগ করুন সার্ভার প্ল্যাটফর্ম। "

আপনি ওপেনসেল দিয়ে শংসাপত্রটিও পরীক্ষা করতে পারেন:

openssl s_client -debug -connect www.thedomaintocheck.com:443

আপনি সম্ভবত দেখতে পাবেন:

Verify return code: 21 (unable to verify the first certificate)

এবং, পূর্বে আউটপুট:

depth=0 OU = Domain Control Validated, CN = www.thedomaintocheck.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 OU = Domain Control Validated, CN = www.thedomaintocheck.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 OU = Domain Control Validated, CN = www.thedomaintocheck.com
verify error:num=21:unable to verify the first certificate`

শংসাপত্র শৃঙ্খলে কেবল 1 টি উপাদান থাকবে (আপনার শংসাপত্র):

Certificate chain
 0 s:/OU=Domain Control Validated/CN=www.thedomaintocheck.com
  i:/O=AlphaSSL/CN=AlphaSSL CA - G2

... তবে অ্যান্ড্রয়েড (ভেরিসাইন, গ্লোবাল সাইন, ইত্যাদি) দ্বারা বিশ্বাসযোগ্য এমন একটি শৃঙ্খলে স্বাক্ষরকারী কর্তৃপক্ষকে উল্লেখ করা উচিত:

Certificate chain
 0 s:/OU=Domain Control Validated/CN=www.thedomaintocheck.com
   i:/O=AlphaSSL/CN=AlphaSSL CA - G2
 1 s:/O=AlphaSSL/CN=AlphaSSL CA - G2
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
 2 s:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA

আপনার সার্ভারটি কনফিগার করার নির্দেশাবলী (এবং মধ্যবর্তী শংসাপত্রগুলি) সাধারণত আপনার কর্তৃপক্ষের দ্বারা প্রদত্ত কর্তৃপক্ষের দ্বারা সরবরাহ করা হয়, উদাহরণস্বরূপ: http://www.alphassl.com/support/install-root-certificate.html

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


3
ওপিতে যে সার্ভারগুলির সাথে এসএসএল কনফিগারেশনটি সে সংযুক্ত হচ্ছে সেগুলিতে অ্যাক্সেস রয়েছে তবে এটি একটি সমাধান হতে পারে। তবে যদি সে সেটির সাথে সংযোগ দিচ্ছে এমন হোস্টিংয়ের একজন না হয় তবে তাকে সমস্যাটি তার পক্ষে সমাধান করতে হবে, যার অর্থ কাস্টম ট্রাস্ট ম্যানেজারকে বাস্তবায়ন করা।
ম্যাথিয়াস বি

9
আপনার সমাধান কাজ করে, কোনও প্রশ্ন নেই, তবে আপনি সম্মত হন না যে এটি মূল কারণগুলির জন্য স্থির চেয়ে এক কর্মক্ষেত্র? যদি আমাকে 3 টি ক্লায়েন্ট (অ্যান্ড্রয়েড, আইওএস, উইন্ডোজ মোবাইল) থেকে কোনও সার্ভারের সাথে সংযোগ স্থাপন করতে হয় তবে আমাকে 3 টির উপরেই কাজটি প্রয়োগ করতে হবে, আমি সার্ভারটি একবারে ঠিক করতে পারি এবং তারা সমস্ত "কেবলমাত্র কাজ করবে"।
স্টিভি

2
ধন্যবাদ স্টিভী, আমি আমার সার্ভারটি 3 মাস ধরে ভুল কনফিগার করেছিলাম এবং কেবল এখনই আমি এটি সনাক্ত করেছি! এখন আমার অ্যান্ড্রয়েড অ্যাপ 100%
jpros

2
@ স্টেভি আমি একই ডোমেনটি ভাগ করে নেওয়ার জন্য বিভিন্ন এপিআইগুলিকে অনেকগুলি কল করি, তবে তাদের মধ্যে কেবল একটিই ব্যর্থ হয় (javax.net.ssl.SSLHandshakeException) ... এই জাতীয় ঘটনা ঘটবে কেন কোনও ধারণা? এবং যাইহোক, এসএসএল শংসাপত্রটি বিশ্বাসযোগ্য নয়। সুতরাং, আমি ভেবেছিলাম যে সমস্ত কল একই ব্যতিক্রম সহ ব্যর্থ হয় should
fair:

1
@ ডিভায়ে সার্ভারের মালিকানাধীন যার সাথে যোগাযোগ করুন এবং তাদের কনফিগারটি নষ্ট হয়ে গেছে এবং তাদের https ঠিকমতো কাজ করছে না - এটি ডিজিগার্ট.হেল্প প্রমাণ করার জন্য তাদের এই লিঙ্কটি দিন ... আমি ধারণা করি তারা প্রশংসা করবে এবং দ্রুত হবে সমাধান করুন। অন্যথায় আপনাকে অন্যান্য উত্তরের একটি কার্যকর পদক্ষেপ নিতে হবে, তবে তারপরে আপনাকে কোনও সুরক্ষা গ্রহণ করতে হবে না (শংসাপত্রগুলি উপেক্ষা করুন) বা শংসাপত্রের মেয়াদ শেষ হয়ে গেলে আপনার অ্যাপ্লিকেশনগুলি পুনরায় চালু করতে হবে এবং আপনার কাস্টম ট্রাস্ট স্টোর আর নতুনের সাথে মেলে না যা নিশ্চিতভাবে ঘটবে।
স্টিভি

17

আপনি রানটাইমে নির্দিষ্ট শংসাপত্রের উপর বিশ্বাস রাখতে পারেন। এসএসএল-ইউটিস-অ্যান্ড্রয়েড
ব্যবহার করে এটি কেবল সার্ভার থেকে ডাউনলোড করুন, সম্পদগুলিতে রাখুন এবং এ জাতীয় লোড করুন :

OkHttpClient client = new OkHttpClient();
SSLContext sslContext = SslUtils.getSslContextForCertificateFile(context, "BPClass2RootCA-sha2.cer");
client.setSslSocketFactory(sslContext.getSocketFactory());

উপরের উদাহরণে আমি ব্যবহার করেছি OkHttpClientতবে SSLContextজাভাতে যে কোনও ক্লায়েন্টের সাথে ব্যবহার করা যেতে পারে।

আপনার যদি কোনও প্রশ্ন থাকে তবে নির্দ্বিধায় জিজ্ঞাসা করুন। আমি এই ছোট লাইব্রেরির লেখক।


.pfx সম্পর্কে কি?
চোলতস্কি

2
যে কোনও ব্যবহারকারী একবার এপিপি তৈরির পরে কোনও অ্যাপ্লিকেশনটির জন্য সম্পদ ফোল্ডারটি অ্যাক্সেস করতে পারবেন তা কি এই সুরক্ষিত নয়?
প্যাট্রিস আন্দালা

1
@ পেট্রিসআন্ডালা, রুট সিএগুলি সর্বজনীনভাবে উপলভ্য, তাই ঠিক আছে
বেকবট

17

সর্বশেষতম অ্যান্ড্রয়েড ডকুমেন্টেশনের উপর ভিত্তি করে আপডেট করুন (মার্চ 2017):

আপনি যখন এই ধরণের ত্রুটি পান:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:374)
        at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)
        at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
        at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
        at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
        at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
        at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
        at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
        at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)

বিষয়টি নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:

  1. সার্ভার শংসাপত্র জারি করা সিএ অজানা ছিল
  2. সার্ভার শংসাপত্রটি কোনও সিএ দ্বারা স্বাক্ষরিত হয়নি, তবে স্ব স্বাক্ষরিত ছিল
  3. সার্ভার কনফিগারেশনটিতে একটি অন্তর্বর্তী সিএ অনুপস্থিত

সমাধানটি HttpsURLConnectionসিএর একটি নির্দিষ্ট সেটকে বিশ্বাস করতে শেখানো । কিভাবে? দয়া করে https://developer.android.com/training/articles/security-ssl.html#CommonProblems দেখুন

অন্যরা যারা লাইব্রেরি AsyncHTTPClientথেকে ব্যবহার করছেন com.loopj.android:android-async-http, দয়া করে এইচটিটিপিএস ব্যবহার করতে অ্যাসিঙ্ক এইচটিএলপিপ্লায়েন্ট সেটআপ পরীক্ষা করুন ।


5
কেউ যদি ওখিপিটিপি ক্লায়েন্ট ব্যবহার করে তবে কী হবে?
TheLearner

ওখট্টপ্পের জন্য, প্লিজ @ এমকেলিমেকের উত্তর পরীক্ষা করে দেখুন।
ব্যবহারকারী1506104

14

আপনি যদি retrofit ব্যবহার করেন, আপনার আপনার OkHttpClient কাস্টমাইজ করতে হবে।

retrofit = new Retrofit.Builder()
                        .baseUrl(ApplicationData.FINAL_URL)
                        .client(getUnsafeOkHttpClient().build())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

সম্পূর্ণ কোড নীচে হিসাবে আছে।

    public class RestAdapter {

    private static Retrofit retrofit = null;
    private static ApiInterface apiInterface;

    public static OkHttpClient.Builder getUnsafeOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
            return builder;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static ApiInterface getApiClient() {
        if (apiInterface == null) {

            try {
                retrofit = new Retrofit.Builder()
                        .baseUrl(ApplicationData.FINAL_URL)
                        .client(getUnsafeOkHttpClient().build())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

            } catch (Exception e) {

                e.printStackTrace();
            }


            apiInterface = retrofit.create(ApiInterface.class);
        }
        return apiInterface;
    }

}

1
আমি কোডটি ব্যবহার করার চেষ্টা করছি তবে আমি নীচের ত্রুটিটি আবার পাচ্ছি " আপনি কি এতে সহায়তা করতে পারেন
বিশ্ব প্রতাপ

এটি র‌্যাডিক্যালি অনিরাপদ। ব্যবহার করবেন না.
মার্কিনিউ লর্নে

ধন্যবাদ! কোটলিনে পদ্ধতিটি পুনরায় লিখুন getUnsafeOkHttpClient(): স্ট্যাকওভারফ্লো . com/ a/ 60507560/ 2914140
কুলমাইন্ড

11

খুব পুরানো পোস্টে উত্তর। তবে সম্ভবত এটি কিছু নবাগতকে সহায়তা করবে এবং যদি উপরের কোনওটি কার্যকর না হয়।

ব্যাখ্যা: আমি জানি কেউ ব্যাখ্যা বোকা চায় না; বরং সমাধান। তবে একটি লাইনারে আপনি নিজের স্থানীয় মেশিন থেকে কোনও দূরবর্তী মেশিনে কোনও পরিষেবা অ্যাক্সেস করার চেষ্টা করছেন যা আপনার মেশিনকে বিশ্বাস করে না। দূরবর্তী সার্ভার থেকে আপনার আস্থা অর্জনের অনুরোধ রইল।

সমাধান: নিম্নলিখিত সমাধান অনুমান করে যে আপনি নিম্নলিখিত শর্তগুলি পূরণ করেছেন

  1. আপনার স্থানীয় মেশিন থেকে একটি রিমোট এপিআই অ্যাক্সেস করার চেষ্টা করছেন।
  2. আপনি অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরি করছেন
  3. আপনার রিমোট সার্ভারটি প্রক্সি পরিস্রাবণের অধীনে রয়েছে (রিমোট এপিআই পরিষেবাটি অ্যাক্সেস করতে আপনি সাধারণত আপনার ব্রাউজার সেটিংয়ে প্রক্সি ব্যবহার করেন, সাধারণত স্টেজিং বা ডেভ সার্ভার)
  4. আপনি বাস্তব ডিভাইসে পরীক্ষা করছেন

পদক্ষেপ:

আপনার অ্যাপটিতে সাইন আপ করতে আপনার একটি। কিস্টোর এক্সটেনশন ফাইলের প্রয়োজন need আপনি কী কী স্টোর ফাইল তৈরি করবেন তা না জানলে; তারপরে নীচের অংশটি অনুসরণ করুন .keystore ফাইল তৈরি করুন বা অন্যথায় পরবর্তী বিভাগ সাইন এপিকে ফাইল এ যান

.Keystore ফাইল তৈরি করুন

Android স্টুডিও খুলুন। শীর্ষস্থানীয় মেনুতে ক্লিক করুন> স্বাক্ষরিত APK তৈরি করুন। পরবর্তী উইন্ডোতে নতুন তৈরি করুন ... বোতামটি ক্লিক করুন। নতুন উইন্ডোতে, দয়া করে সমস্ত ক্ষেত্রে ডেটা ইনপুট করুন। দুটি পাসওয়ার্ড ক্ষেত্র মনে রাখবেন যা আমি প্রস্তাব দিচ্ছি একই পাসওয়ার্ড থাকা উচিত; বিভিন্ন পাসওয়ার্ড ব্যবহার করবেন না; এবং সবচেয়ে বেশি ক্ষেত্র এ সংরক্ষণ পথ মনে রাখবেন কী সঞ্চয় পথ: । আপনি সমস্ত ক্ষেত্র ইনপুট করার পরে ঠিক আছে বোতামটি ক্লিক করুন।

এপিকে ফাইল সাইন করুন

এখনই আপনার তৈরি করা কী-স্টোর ফাইলটি দিয়ে আপনাকে একটি স্বাক্ষরিত অ্যাপ্লিকেশন তৈরি করতে হবে। এই পদক্ষেপগুলি অনুসরণ করুন

  1. বিল্ড> ক্লিন প্রজেক্ট, এটি পরিষ্কার শেষ হওয়া পর্যন্ত অপেক্ষা করুন
  2. বিল্ড> স্বাক্ষরিত APK তৈরি করুন
  3. Choose existing...বোতাম ক্লিক করুন
  4. আমরা সবেমাত্র .keystore ফাইল তৈরি করুন বিভাগে তৈরি .keystore ফাইলটি নির্বাচন করুন
  5. .Keystore ফাইল বিভাগ তৈরি করার সময় আপনি তৈরি করেছেন একই পাসওয়ার্ড লিখুন । ক্ষেত্র Key store passwordএবং Key passwordক্ষেত্রগুলির জন্য একই পাসওয়ার্ড ব্যবহার করুন । উপনামটিও প্রবেশ করান
  6. Next বাটনে ক্লিক করুন
  7. পরবর্তী পর্দায়; যা build.gradleফাইলগুলিতে আপনার সেটিংসের উপর ভিত্তি করে আলাদা হতে পারে , আপনাকে নির্বাচন করতে হবে Build Typesএবং Flavors
  8. জন্য Build Typesচয়ন releaseড্রপডাউন থেকে
  9. জন্য Flavorsঅবশ্য এটা করবে আপনার সেটিংসের উপর নির্ভর করে build.gradleফাইল। stagingএই ক্ষেত্র থেকে চয়ন করুন । আমি নীচে নীচের সেটিংস ব্যবহার করেছি build.gradle, আপনি আমার হিসাবে একইটি ব্যবহার করতে পারেন তবে নিশ্চিত হয়ে নিন যে আপনি এটি applicationIdআপনার প্যাকেজের নামে পরিবর্তন করেছেন

    productFlavors {
        staging {
            applicationId "com.yourapplication.package"
            manifestPlaceholders = [icon: "@drawable/ic_launcher"]
            buildConfigField "boolean", "CATALYST_DEBUG", "true"
            buildConfigField "boolean", "ALLOW_INVALID_CERTIFICATE", "true"
        }
        production {
            buildConfigField "boolean", "CATALYST_DEBUG", "false"
            buildConfigField "boolean", "ALLOW_INVALID_CERTIFICATE", "false"
        }
    }
  10. নীচে দুটি Signature Versionsচেকবক্স এবং ক্লিক করুন Finishবোতাম।

প্রায় সেখানে:

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

অ্যান্ড্রয়েড ডিভাইসে প্রক্সি সেটিং:

  1. অ্যান্ড্রয়েড ফোনটির অভ্যন্তরে সেটিংটি ক্লিক করুন এবং তারপরে Wi-Fi
  2. সংযুক্ত ওয়াইফাইটিতে দীর্ঘক্ষণ টিপুন এবং নির্বাচন করুন Modify network
  3. আপনি Advanced optionsযদি Proxy Hostnameক্ষেত্রটি দেখতে না পান তবে ক্লিক করুন
  4. ইন Proxy Hostnameহোস্ট আইপি লিখুন অথবা আপনি যে নামটি সংযুক্ত করতে চান। একটি সাধারণ স্টেজিং সার্ভার হিসাবে নামকরণ করা হবেstg.api.mygoodcompany.com
  5. পোর্টের জন্য উদাহরণস্বরূপ চার অঙ্কের পোর্ট নম্বর লিখুন 9502
  6. Saveবোতামটি হিট করুন

একটি শেষ স্টপ:

মনে রাখবেন আমরা সাইন এপি কে ফাইল বিভাগে স্বাক্ষরিত APK ফাইল তৈরি করেছি । এখনই সেই APK ফাইলটি ইনস্টল করার সময় এসেছে।

  1. একটি টার্মিনাল খুলুন এবং স্বাক্ষরিত apk ফাইল ফোল্ডারে পরিবর্তিত
  2. আপনার অ্যান্ড্রয়েড ডিভাইসটিকে আপনার মেশিনে সংযুক্ত করুন
  3. অ্যান্ড্রয়েড ডিভাইস থেকে পূর্ববর্তী কোনও ইনস্টল করা এপিকে ফাইল সরান
  4. চালান adb install name of the apk file
  5. যদি কোনও কারণে উপরের কমান্ডটি ফিরে আসে adb command not found। সম্পূর্ণ পথ প্রবেশ করান হিসাবেC:\Users\shah\AppData\Local\Android\sdk\platform-tools\adb.exe install name of the apk file

আমি আশা করি সমস্যার সমাধান হতে পারে। যদি না হয় দয়া করে আমাকে একটি মন্তব্য।

সালাম!


4

আমি যে ত্রুটি বার্তাটি পাচ্ছিলাম তা অনুরূপ তবে কারণ স্ব স্বাক্ষরিত শংসাপত্রের মেয়াদ শেষ হয়ে গেছে। যখন ওপেনসেল ক্লায়েন্টের চেষ্টা করা হয়েছিল তখন এটি ফায়ারফক্স থেকে শংসাপত্রের ডায়ালগটি পরীক্ষা করে যাচ্ছিল সে কারণটি আমাকে অগ্রাহ্য করেছিল।

সুতরাং সাধারণভাবে, যদি শংসাপত্রটি কীস্টোর এবং এর "ভ্যালিড" তে থাকে তবে এই ত্রুটিটি বন্ধ হয়ে যাবে।


1
যদি শংসাপত্রটির মেয়াদ শেষ হয়ে যায় তবে এটি বেশ কয়েকটি মান অনুযায়ী বৈধ নয়। একটি কাস্টম TrustManagerব্যবহার এবং মানদণ্ডের একটি আলাদা সেট ব্যবহার করা ঠিক আছে । কিন্তু বাক্সের বাইরে, আপনার সাথে কাজ করতে হবে এটি।
jww

4

অ্যান্ড্রয়েড ক্লায়েন্ট থেকে কুরেটো সার্ভারে সংযোগ করার সময় আমারও একই সমস্যা ছিল। কুরেন্তো সার্ভার jks শংসাপত্র ব্যবহার করে, তাই আমাকে এটিতে pem রূপান্তর করতে হয়েছিল। রূপান্তরকরণের জন্য ইনপুট হিসাবে আমি cert.pem ফাইল ব্যবহার করেছি এবং এটি এর ফলে ত্রুটি ঘটায়। কিন্তু যদি ব্যবহার fullchain.pem পরিবর্তে cert.pem - সব ঠিক আছে।


3

কোনও ডোমেন পরীক্ষা করতে https://www.ssllabs.com/ssltest/ ব্যবহার করুন ।

কোটলিনে শিহাব উদ্দিনের সমাধান ।

import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.*
import javax.security.cert.CertificateException

companion object {

    private val gson: Gson
    private val retrofit: Retrofit

    init {

        val okHttpClient = getUnsafeOkHttpClient() // OkHttpClient().newBuilder()
            .build()

        gson = GsonBuilder().setLenient().create()

        retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build()
    }

    private fun getUnsafeOkHttpClient(): OkHttpClient.Builder =
        try {
            // Create a trust manager that does not validate certificate chains
            val trustAllCerts: Array<TrustManager> = arrayOf(
                object : X509TrustManager {
                    @Throws(CertificateException::class)
                    override fun checkClientTrusted(chain: Array<X509Certificate?>?,
                                                    authType: String?) = Unit

                    @Throws(CertificateException::class)
                    override fun checkServerTrusted(chain: Array<X509Certificate?>?,
                                                    authType: String?) = Unit

                    override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
                }
            )
            // Install the all-trusting trust manager
            val sslContext: SSLContext = SSLContext.getInstance("SSL")
            sslContext.init(null, trustAllCerts, SecureRandom())
            // Create an ssl socket factory with our all-trusting manager
            val sslSocketFactory: SSLSocketFactory = sslContext.socketFactory
            val builder = OkHttpClient.Builder()
            builder.sslSocketFactory(sslSocketFactory,
                trustAllCerts[0] as X509TrustManager)
            builder.hostnameVerifier { _, _ -> true }
            builder
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
}

2

আমার একই সমস্যাটি যা পেয়েছিলাম তা হ'ল আমি যে শংসাপত্র .crt ফাইল সরবরাহ করেছি তাতে একটি অন্তর্বর্তী শংসাপত্র অনুপস্থিত। সুতরাং আমি আমার সার্ভার অ্যাডমিনের কাছ থেকে সমস্ত .crt ফাইলগুলি জিজ্ঞাসা করেছি, তারপরে বিপরীত ক্রমে সেগুলিতে একত্র হয়েছি।

যাত্রা। 1. রুট.সিআরটি 2. ইন্টার সিআরটি 3. মাইক্রিট.ক্র্ট

উইন্ডোতে আমি অনুলিপি কার্যকর করেছি Inter.crt + Root.crt newCerર્ટate.crt

(এখানে আমি myCrt.crt উপেক্ষা করেছি)

তারপরে আমি ইনপুটস্ট্রিমের মাধ্যমে কোডে newCertificate.crt ফাইল সরবরাহ করেছি। কাজ শেষ.


আমাদেরও একই সমস্যা ছিল। মধ্যবর্তী শংসাপত্রটি অনুপস্থিত ছিল
নীধীন চন্দ্রন

1

ট্রাস্টের অ্যাঙ্কর ত্রুটিটি অনেক কারণে ঘটতে পারে। আমার জন্য কেবল এটি ছিল যে আমি https://example.com/পরিবর্তে অ্যাক্সেস করার চেষ্টা করছিলাম https://www.example.com/

সুতরাং আপনি নিজের ইউআরএলগুলি নিজের ট্রাস্ট ম্যানেজারটি তৈরি করার আগে (আমি যেমন করেছি) ডাবল-চেক করতে চাইতে পারেন want


0

জিঞ্জারব্রেড ফোনগুলিতে আমি সর্বদা এই ত্রুটিটি পাই: Trust Anchor not found for Android SSL Connectionযদিও আমি আমার শংসাপত্রের উপর নির্ভর করতে সেটআপ করি।

আমি যে কোডটি ব্যবহার করি তা এখানে (স্কালার ভাষায়):

object Security {
    private def createCtxSsl(ctx: Context) = {
        val cer = {
            val is = ctx.getAssets.open("mycertificate.crt")
            try
                CertificateFactory.getInstance("X.509").generateCertificate(is)
            finally
                is.close()
        }
        val key = KeyStore.getInstance(KeyStore.getDefaultType)
        key.load(null, null)
        key.setCertificateEntry("ca", cer)

        val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm)
    tmf.init(key)

        val c = SSLContext.getInstance("TLS")
        c.init(null, tmf.getTrustManagers, null)
        c
    }

    def prepare(url: HttpURLConnection)(implicit ctx: Context) {
        url match {
            case https: HttpsURLConnection 
                val cSsl = ctxSsl match {
                    case None 
                        val res = createCtxSsl(ctx)
                        ctxSsl = Some(res)
                        res
                    case Some(c)  c
                }
                https.setSSLSocketFactory(cSsl.getSocketFactory)
            case _ 
        }
    }

    def noSecurity(url: HttpURLConnection) {
        url match {
            case https: HttpsURLConnection 
                https.setHostnameVerifier(new HostnameVerifier {
                    override def verify(hostname: String, session: SSLSession) = true
                })
            case _ 
        }
    }
}

এবং এখানে সংযোগ কোডটি রয়েছে:

def connect(securize: HttpURLConnection  Unit) {
    val conn = url.openConnection().asInstanceOf[HttpURLConnection]
    securize(conn)
    conn.connect();
    ....
}

try {
    connect(Security.prepare)
} catch {
    case ex: SSLHandshakeException /*if ex.getMessage != null && ex.getMessage.contains("Trust anchor for certification path not found")*/ 
        connect(Security.noSecurity)
}

মূলত, আমি আমার কাস্টম শংসাপত্রের উপর বিশ্বাস রাখতে সেটআপ করি। যদি এটি ব্যর্থ হয়, তবে আমি সুরক্ষা অক্ষম করি। এটি সেরা বিকল্প নয়, তবে পুরানো এবং বগী ফোনগুলির সাথে আমার জানা একমাত্র পছন্দ।

এই নমুনা কোডটি সহজেই জাভায় অনুবাদ করা যায়।


কেস কেউ অ্যান্ড্রয়েড 2.3.x জন্য সমাধান, এটি প্রয়োজন stackoverflow.com/a/46465722/7125370
Newbie009

0

আমার ক্ষেত্রে এটি অ্যান্ড্রয়েড 8.0 এ আপডেট হওয়ার পরে ঘটছিল। স্ব-স্বাক্ষরযুক্ত শংসাপত্রটি অ্যান্ড্রয়েডকে বিশ্বাস করতে সেট করা হয়েছিল স্বাক্ষর অ্যালগরিদম SHA1withRSA ব্যবহার করে। একটি নতুন সারিতে স্যুইচ করে স্বাক্ষর অ্যালগরিদম SHA256WithRSA ব্যবহার করে সমস্যার সমাধান হয়েছে।


0

আমি জানি যে আপনাকে সমস্ত শংসাপত্রের উপর আস্থা রাখার দরকার নেই তবে আমার ক্ষেত্রে আমার কিছু ডিবাগিং পরিবেশের সাথে সমস্যা হয়েছিল যেখানে আমাদের স্ব-স্বাক্ষরিত শংসাপত্র ছিল এবং আমার একটি নোংরা সমাধানের প্রয়োজন হয়েছিল।

আমাকে যা করতে হয়েছিল তা হল শুরুতে পরিবর্তন করা sslContext

mySSLContext.init(null, trustAllCerts, null); 

যেখানে trustAllCertsএটি তৈরি করা হয়েছিল:

private final 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 {
    }
} };

আশা করি এটি কার্যকর হবে।


এটাই আমি চেয়েছিলাম! ধন্যবাদ
18-18 এ অক্সাইড করা হয়েছে

আমি ভুল পান Hostname '192.168.0.16' was not verified। আমি স্থানীয়ভাবে আমার ডিবাগার (আইআইএস এক্সপ্রেস) এর মাধ্যমে আমার ওয়েবপিটি পরীক্ষা করছি। কোন ধারনা কিভাবে এটা ঠিক করতে হবে? ধন্যবাদ :)
স্যাম

1
এটি মূলত অনিরাপদ। ব্যবহার করবেন না.
লার্নের মারকুইস

0

আমারও একই সমস্যা ছিল এবং আমি সমস্ত উত্সকে বিশ্বাস করার কৌশলটি সম্পূর্ণভাবে বাতিল করে দিয়েছি।

আমি এখানে আমার সমাধানটি কোটলিনে প্রয়োগকৃত একটি প্রয়োগটিতে প্রয়োগ করা হয়েছে share

আমি প্রথমে শংসাপত্র এবং এর বৈধতা সম্পর্কে তথ্য পেতে নিম্নলিখিত ওয়েবসাইটটি ব্যবহার করার পরামর্শ দেব

এটি একটি হিসাবে প্রদর্শিত না হয়, তাহলে 'গৃহীত ইস্যুকারীগণ' মধ্যে অ্যান্ড্রয়েড ডিফল্ট ট্রাস্ট দোকান , আমরা যে শংসাপত্র পেতে এবং আবেদন সেটিকে নিগমবদ্ধ একটি কাস্টম ট্রাস্ট দোকান তৈরি করতে হবে

আমার ক্ষেত্রে আদর্শ সমাধানটি হ'ল একটি উচ্চ-স্তরের ট্রাস্ট ম্যানেজার তৈরি করা যা কাস্টম এবং অ্যান্ড্রয়েড ডিফল্ট ট্রাস্ট স্টোরকে একত্রিত করে

এখানে তিনি OkrttitClient যা তিনি পুনঃনির্মাণের সাথে ব্যবহার করেছেন সেটি কনফিগার করতে ব্যবহৃত উচ্চ স্তরের কোডটি প্রকাশ করে oses

override fun onBuildHttpClient(httpClientBuild: OkHttpClient.Builder) {

        val trustManagerWrapper = createX509TrustManagerWrapper(
            arrayOf(
                getCustomX509TrustManager(),
                getDefaultX509TrustManager()
            )
        )

        printX509TrustManagerAcceptedIssuers(trustManagerWrapper)

        val sslSocketFactory = createSocketFactory(trustManagerWrapper)
        httpClientBuild.sslSocketFactory(sslSocketFactory, trustManagerWrapper)

    }

এইভাবে, আমি স্ব-স্বাক্ষরিত শংসাপত্রের সাথে এবং অন্যান্য সার্ভারের সাথে বিশ্বস্ত শংসাপত্রের সত্তার দ্বারা প্রদত্ত শংসাপত্রের সাথে যোগাযোগ করতে পারি

এটি হ'ল, আমি আশা করি এটি কাউকে সহায়তা করতে পারে।


0

আমি জানি এটি একটি খুব পুরানো নিবন্ধ, তবে আমার আস্থার অ্যাঙ্কর সমস্যাগুলি সমাধান করার চেষ্টা করার সময় আমি এই নিবন্ধটি জুড়ে এসেছি। আমি কীভাবে এটি স্থির করেছি তা পোস্ট করেছি। আপনি যদি আপনার রুট সিএ প্রাক-ইনস্টল করেন তবে আপনাকে ম্যানিফেস্টে একটি কনফিগারেশন যুক্ত করতে হবে।

https://stackoverflow.com/a/60102517/114265


শুধুমাত্র এপিআই 24+
বেকবট

@ বেকাবাট - সম্ভবত এটি সত্য, তবে ডকুমেন্টেশন অনুসারে 23 এবং নীচে বিশ্বাসকারীর শংসাপত্রগুলি ডিফল্টরূপে ডিফল্টরূপে, সমস্ত অ্যাপ্লিকেশন থেকে নিরাপদ সংযোগগুলি (টিএলএস এবং এইচটিটিপিএসের মতো প্রোটোকল ব্যবহার করে) প্রাক-ইনস্টল হওয়া সিস্টেম সিএ এবং অ্যান্ড্রয়েড 6.0 কে লক্ষ্যযুক্ত অ্যাপ্লিকেশনগুলিতে বিশ্বাস করে (এপিআই লেভেল 23) এবং
নিম্নটিও

-1
**Set proper alias name**
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509","BC");
            X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream);
            String alias = cert.getSubjectX500Principal().getName();
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null);
trustStore.setCertificateEntry(alias, cert);

-2

আমিও একই সমস্যার মুখোমুখি হয়েছি। আমি ঠিক এইচটিএসপি তে এইচটিএসপি অপসারণ করি, যেমন

final public static String ROOT_URL = "https://example.com"; প্রতি final public static String ROOT_URL = "http://example.com";

ফিনালি, আমি এই সমস্যাটি সমাধান করেছি।


অবশ্যই এটি সমীকরণ থেকে এসএসএল সুরক্ষা সরিয়ে দিচ্ছে, যা সম্ভবত উত্পাদন পরিবেশের জন্য একটি খারাপ ধারণা।
ড্রাগন আইফটস

এটি আসলে কোনও সমাধান নয়, এসএসএল সুরক্ষা অপসারণ করে।
ওমেগা 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.