আমি জাভা 6 ব্যবহার করছি এবং HttpsURLConnection
ক্লায়েন্ট শংসাপত্র ব্যবহার করে একটি রিমোট সার্ভারের বিরুদ্ধে একটি তৈরি করার চেষ্টা করছি ।
সার্ভারটি স্ব-স্বাক্ষরিত মূল শংসাপত্র ব্যবহার করছে এবং এটি প্রয়োজন যে একটি পাসওয়ার্ড-সুরক্ষিত ক্লায়েন্ট শংসাপত্র উপস্থাপন করা হবে। আমি সার্ভারের রুট শংসাপত্র এবং ক্লায়েন্ট শংসাপত্রটি ডিফল্ট জাভা কীস্টোরের মধ্যে পেয়েছি যা আমি পেয়েছি /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(ওএসএক্স 10.5) কীস্টোর ফাইলটির নাম মনে হচ্ছে যে ক্লায়েন্টের শংসাপত্রটি সেখানে যাওয়ার কথা নয়?
যাইহোক, এই স্টোরটিতে মূল শংসাপত্র যুক্ত করা কুখ্যাত সমাধান করেছে javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
তবে, ক্লায়েন্টের শংসাপত্র কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমি এখন আটকে আছি। আমি দুটি পদ্ধতির চেষ্টা করেছি এবং আমাকে কোথাও পাই না।
প্রথমে এবং পছন্দসই, চেষ্টা করুন:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://somehost.dk:3049");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();
// The last line fails, and gives:
// javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
আমি এইচটিটিপিআরএলস কানেকশন ক্লাসটি এড়িয়ে যাওয়ার চেষ্টা করেছি (যেহেতু আমি সার্ভারের সাথে এইচটিটিপি কথা বলতে চাই তাই আদর্শ নয়), এবং পরিবর্তে এটি করুন:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("somehost.dk", 3049);
InputStream inputstream = sslsocket.getInputStream();
// do anything with the inputstream results in:
// java.net.SocketTimeoutException: Read timed out
ক্লায়েন্ট শংসাপত্র এখানে সমস্যা যে আমি এমনকি নিশ্চিত নই।