Javax.net.ssl.SSLHandshakeException ত্রুটি কীভাবে সমাধান করবেন?


103

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

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target

4
আমি কী জানতে চাই, সেই ক্ষেত্রে কোন সঠিক টার্গেট ছিল ... আপনি একটি ব্যতিক্রম পেয়েছেন, তবে আপনি লক্ষ্য সম্পর্কে কোনও তথ্য পাবেন না, যা আপনি প্রত্যাশার চেয়ে আলাদা হতে পারে .. আমার এ জাতীয় ঘটনা আছে, আমি নিশ্চিত আমার লিঙ্ক শংসাপত্র রয়েছে, এবং আমি এখনও এই ব্যতিক্রম
পাচ্ছি

উত্তর:


154

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

এখন আপনার কাছে কোনও ফাইলটিতে শংসাপত্রটি সংরক্ষিত রয়েছে, আপনাকে এটি আপনার জেভিএমের বিশ্বাসের দোকানে যুক্ত করা দরকার। এ $JAVA_HOME/jre/lib/security/JREs জন্য অথবা $JAVA_HOME/lib/securityJDKs জন্য, নামে একজন ফাইল cacertsযা জাভা দিয়ে আসে এবং সুপরিচিত সার্টিফাইং কর্তৃপক্ষ পাবলিক সার্টিফিকেট রয়েছে। নতুন শংসাপত্রটি আমদানি করতে, কিসটোলটি এমন একজন ব্যবহারকারী হিসাবে চালান যার কাছে ক্যাসর্টগুলিতে লেখার অনুমতি রয়েছে:

keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file>

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


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

মূলত আমার পেপাল শংসাপত্র অন্তর্ভুক্ত করা দরকার। আমি আপনার পদক্ষেপগুলি করেছি এবং যথাযথ স্থানে সার্টও যুক্ত করেছি। তাহলে আমি কি অ্যাপটি চালাচ্ছি এটি একই ত্রুটি বলে?
সেলেদুরই

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

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

@ রায়ানস্টেওয়ার্টে কি আমার কোনওভাবে এটি গ্লাস ফিশে আমদানি করা দরকার? কারণ আমি আমার জাভা হোম ডিরেক্টরিতে আমার ক্যাসের্টে .cer ফাইলটি যুক্ত করেছিলাম তবে গ্লাস ফিশ এটি ব্যবহার করছে বলে মনে হয় না তাই আমি এখনও ত্রুটি পাচ্ছি।
সিড

15

এখন আমি এইভাবে এই সমস্যাটি সমাধান করেছি,

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream; 

// Create a trust manager that does not validate certificate chains like the default 

TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {

            public java.security.cert.X509Certificate[] getAcceptedIssuers()
            {
                return null;
            }
            public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
            public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
        }
};

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

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


55
বাহ, আমি এটিকে "ফিক্স" বলতে দ্বিধা করব। আপনি মূলত সিকিউরিটি বন্ধ করেছেন। হ্যাঁ, ডেটা এখনও এনক্রিপ্ট করা হবে তবে আপনি যে কার সাথে কথা বলবেন বলে আশা করছেন তার সাথে আপনি কথা বলছেন এর কোনও গ্যারান্টি নেই। সঠিক সমাধানটি হ'ল আপনার টার্গেট সার্ভারের সর্বজনীন কীটি অর্জন করা এবং সংযোগটি তৈরি করা জেভিএমের বিশ্বাসের দোকানে এটিকে আমদানি করা।
রায়ান স্টুয়ার্ট

4
উপযুক্ত সমাধানের জন্য আমার উত্তরটি দেখুন
রায়ান স্টুয়ার্ট

কিসের উদাহরণ? আমার উত্তরে আপনার প্রয়োজনীয় সমস্ত পদক্ষেপ থাকা উচিত।
রায়ান স্টুয়ার্ট


4
এখানে প্রদর্শিত কোডটি সহায়ক মনে হচ্ছে আপনি যদি কোনও ডেভ সার্ভারের বিরুদ্ধে খুব সাধারণ পরীক্ষা লিখছেন তবে আমি প্রোডাকশনের জন্য যদিও এর উপর নির্ভর করব না।
জেসন ডি

12

আমরা যখনই ইউআরএল সংযোগের চেষ্টা করছি,

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

1) শংসাপত্রের জন্য জিজ্ঞাসা করুন (শংসাপত্রটি ডাউনলোড করুন), বিশ্বস্তরে এই শংসাপত্রটি আমদানি করুন। ডিফল্ট বিশ্বাসযোগ্য জাভা ব্যবহারগুলি \ জাভা \ jdk1.6.0_29 \ jre \ lib \ সুরক্ষা \ ক্যাসর্টগুলিতে পাওয়া যায়, তবে আমরা যদি ইউআরএল সংযোগের সাথে সংযোগ করার চেষ্টা করি তবে তা গ্রহণযোগ্য হবে।

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

পয়েন্ট নং 2 এর জন্য আমাদের নীচের পদক্ষেপগুলি অনুসরণ করতে হবে:

1) নীচে এমন পদ্ধতি লিখুন যা Https URL সংযোগের জন্য হোস্টনাম ভেরিফায়ার সেট করে যা সমস্ত ক্ষেত্রে সত্য হয়ে যায় যার অর্থ আমরা ট্রাস্টস্টোরকে বিশ্বাস করি।

  // trusting all certificate 
 public void doTrustToCertificates() throws Exception {
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }

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

                    public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        return;
                    }
                }
        };

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
                    System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
                }
                return true;
            }
        };
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }

2) নীচে মেথড লিখুন, যা ইউআরএলতে সংযোগ দেওয়ার চেষ্টা করার আগে doTrustToCertificates বলে

    // connecting to URL
    public void connectToUrl(){
     doTrustToCertificates();//  
     URL url = new URL("https://www.example.com");
     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     System.out.println("ResponseCode ="+conn.getResponseCode());
   }

এই কলটি প্রতিক্রিয়া কোডটি ফিরিয়ে দেবে = 200 মানে সংযোগটি সফল।

আরও বিশদ এবং নমুনার উদাহরণের জন্য আপনি URL টি উল্লেখ করতে পারেন ।


4
গুগল প্লে স্টোর এটিকে প্রত্যাখ্যান করবে। তারা দেখতে পাবে যে আপনি APK স্ক্যানের সময় X509 সার্টিফিকেট উপেক্ষা করছেন।
অলিভার ডিকসন

0

এসএসএলহ্যান্ডশেক এক্সেপশন 2 টি সমাধান করা যেতে পারে।

  1. এসএসএল অন্তর্ভুক্ত

    • এসএসএল পান (উত্স সিস্টেম প্রশাসকের কাছে জিজ্ঞাসা করে, ওপেনসেল কমান্ড দ্বারা ডাউনলোড করা যেতে পারে, বা কোনও ব্রাউজার শংসাপত্রগুলি ডাউনলোড করে)

    • জেআরই / লিব / সুরক্ষায় অবস্থিত ট্রাস্টস্টোর (ক্যাচার্টস) এ শংসাপত্র যুক্ত করুন

    • "-Djavax.net.ssl.trustStore =" হিসাবে ভিএম আর্গুমেন্টে ট্রস্টস্টোর অবস্থান সরবরাহ করুন

  2. এসএসএল উপেক্ষা করা হচ্ছে

    এই # 2 এর জন্য, দয়া করে অন্য স্ট্যাকওভারফ্লো ওয়েবসাইটে আমার অন্য উত্তরটি দেখুন: এসএসএল যাচাইকরণ কীভাবে করবেন তা জাভা সহ SSL শংসাপত্র ত্রুটি উপেক্ষা করুন


-1

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

সমস্ত ওএসের আস্থা একটি মুষ্টিমেয় শংসাপত্র কর্তৃপক্ষ এবং আরও ছোট শংসাপত্র জারিকারীদের যদি একটি বড় শংসাপত্রের শংসাপত্রগুলির একটি শৃঙ্খলা তৈরি করে শংসাপত্রের প্রয়োজন হয় যদি আপনি আমার বলতে চাইছেন ...

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

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

আমি প্রায় দুই মাস আগে এটি করেছি এবং এখনই আমার উপর সোর্স কোড নেই have গুগল ব্যবহার করুন এবং আপনার এই সমস্যাটি সমাধান করতে সক্ষম হওয়া উচিত। আপনি যদি আমাকে ফিরে বার্তা দিতে না পারেন এবং আমি আপনাকে প্রকল্পের জন্য প্রাসঙ্গিক উত্স কোড সরবরাহ করতে পারি .. আপনি কি এই ব্যতিক্রমগুলির কারণ হয়ে কোড সরবরাহ করেন নি তাই এটি আপনার সমস্যার সমাধান করে কিনা তা জানেন না ont তবুও আমি অ্যাপলেটগুলির সাথে কাজ করছিলাম ভেবেছিলাম এটি সার্ভারলেটগুলিতে কেন কাজ করবে না তা আমি দেখতে পাচ্ছি না ...

আমার অফিসে বাহ্যিক এসএসএইচ অক্ষম থাকায় পিএস আমি উইকএন্ডের আগে সোর্স কোড পাই না :(


4
PS আমার সার্ভারের পাবলিক কীগুলি বের করতে এবং সঞ্চয় করতে অনলাইনে এই জাভা কোডটি খুঁজে পেয়েছি তাই গুগল করা থাকুন বা রবিবার অপেক্ষা করুন
ওসামা জাভেদ

-8

এখন আমি এইভাবে এই সমস্যাটি সমাধান করেছি,

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream;
// Create a trust manager that does not validate certificate chains like the 
default TrustManager[] trustAllCerts = new TrustManager[] {
    new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
    }
};
// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
    System.out.println(e);
}

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