জাভা ক্লায়েন্টে সার্ভারের স্ব-স্বাক্ষরিত এসএসএল শংসাপত্র গ্রহণ করুন


215

এটি দেখতে একটি স্ট্যান্ডার্ড প্রশ্নের মতো, তবে আমি কোথাও পরিষ্কার দিকনির্দেশ পাইনি।

আমার জাভা কোডটি সম্ভবত স্ব-স্বাক্ষরিত (বা মেয়াদ উত্তীর্ণ) শংসাপত্রের সাথে কোনও সার্ভারের সাথে সংযোগ করার চেষ্টা করছে। কোড নিম্নলিখিত ত্রুটি রিপোর্ট করে:

[HttpMethodDirector] I/O exception (javax.net.ssl.SSLHandshakeException) caught 
when processing request: sun.security.validator.ValidatorException: PKIX path 
building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

যেহেতু আমি এটি বুঝতে পেরেছি, আমাকে কীটোল ব্যবহার করতে হবে এবং জাভাটিকে বলতে হবে যে এই সংযোগটি অনুমোদন করা ঠিক আছে OK

এই সমস্যাটি সমাধানের জন্য সমস্ত নির্দেশাবলী ধরে নিই আমি কীটোলে সম্পূর্ণরূপে দক্ষ, যেমন

সার্ভারের জন্য ব্যক্তিগত কী উত্পন্ন করুন এবং কীস্টোরে আমদানি করুন

এমন কেউ কি আছে যারা বিস্তারিত নির্দেশাবলী পোস্ট করতে পারে?

আমি ইউনিক্স চালাচ্ছি, সুতরাং বাশ স্ক্রিপ্ট সবচেয়ে ভাল হবে।

এটি গুরুত্বপূর্ণ কিনা তা নিশ্চিত নয়, তবে কোডটি jboss এ কার্যকর করা হয়েছে।


2
দেখুন আমি কীভাবে জাভা এইচটিএসপিআরএল সংযোগের সাথে স্ব-স্বাক্ষরিত শংসাপত্র গ্রহণ করব? । স্পষ্টতই, আপনি যদি কোনও বৈধ শংসাপত্র ব্যবহারের জন্য সাইটটি পান তবে এটি আরও ভাল।
ম্যাথু ফ্ল্যাশেন

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

2
@ ম্যাথেজফ্ল্যাশেন - "স্পষ্টতই, আপনি যদি কোনও বৈধ শংসাপত্রটি ব্যবহার করার জন্য সাইটটি পেতে পারেন তবে এটি আরও ভাল হবে ..." - ক্লায়েন্ট যদি এটি বিশ্বাস করে তবে একটি স্বাক্ষরযুক্ত শংসাপত্রই একটি বৈধ শংসাপত্র। অনেকে মনে করেন সিএ / ব্রাউজার কার্টেলকে বিশ্বাস প্রদান করা একটি সুরক্ষা ত্রুটি।
jww

3
সম্পর্কিত, দেখুন বিশ্বের সবচেয়ে বিপজ্জনক কোড: অ ব্রাউজার সফ্টওয়্যারটিতে এসএসএল শংসাপত্রগুলি বৈধকরণ । (লিঙ্কটি সরবরাহ করা হয়েছে যেহেতু আপনি সেই স্প্যামি উত্তর পেয়ে যাচ্ছেন যাচাইকরণ অক্ষম করে)।
jww

উত্তর:


306

আপনার এখানে মূলত দুটি বিকল্প রয়েছে: আপনার জেভিএম ট্রাস্টস্টোরের মধ্যে স্ব-স্বাক্ষরিত শংসাপত্র যুক্ত করুন বা আপনার ক্লায়েন্টকে এতে কনফিগার করুন

বিকল্প 1

আপনার ব্রাউজার থেকে শংসাপত্রটি রফতানি করুন এবং এটি আপনার জেভিএম ট্রাস্টস্টোরে আমদানি করুন (বিশ্বাসের একটি শৃঙ্খলা স্থাপনের জন্য):

<JAVA_HOME>\bin\keytool -import -v -trustcacerts
-alias server-alias -file server.cer
-keystore cacerts.jks -keypass changeit
-storepass changeit 

বিকল্প 2

শংসাপত্রের বৈধতা অক্ষম করুন:

// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { 
    new X509TrustManager() {     
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
            return new X509Certificate[0];
        } 
        public void checkClientTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
            } 
        public void checkServerTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    } 
}; 

// 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 (GeneralSecurityException e) {
} 
// Now you can access an https URL without having the certificate in the truststore
try { 
    URL url = new URL("https://hostname/index.html"); 
} catch (MalformedURLException e) {
} 

মনে রাখবেন যে আমি বিকল্পটি # 2 মোটেই সুপারিশ করি না । ট্রাস্ট ম্যানেজারকে অক্ষম করা SSL এর কিছু অংশকে পরাস্ত করে এবং মাঝারি আক্রমণগুলিতে আপনাকে মানুষের পক্ষে দুর্বল করে তোলে। বিকল্প # 1 পছন্দ করুন বা আরও ভাল, সার্ভারে একটি "সত্যিকারের" শংসাপত্রটি একটি সুপরিচিত সিএ স্বাক্ষরিত করুন have


7
শুধু এমআইএম আক্রমণ নয়। এটি আপনাকে ভুল সাইটের সাথে সংযোগের জন্য দুর্বল করে তোলে। এটি সম্পূর্ণ অনিরাপদ। আরএফসি 2246 দেখুন I আমি সর্বদা এই ট্রাস্ট ম্যানেজার পোস্ট করার বিরোধিতা করি। এটি আর্টের নিজস্ব স্পেসিফিকেশনও সঠিক নয়।
লার্নের মারকুইস

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

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

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

2
@ রিচ, years বছর দেরীতে, তবে আপনি লক আইকনটি -> আরও তথ্য -> শংসাপত্র দেখুন -> বিশদ ট্যাব -> রফতানি ... ক্লিক করে ফায়ারফক্সে সার্ভার শংসাপত্রটি ধরে রাখতে পারেন well এটি খুব গোপন।
সিদ্ধার্থ

9

আমি এই সমস্যাটি এমন একটি শংসাপত্র সরবরাহকারীর কাছে তাড়া করেছি যা ডিফল্ট জেভিএম বিশ্বস্ত হোস্টগুলির অংশ নয় JDK 8u74। সরবরাহকারীটি হ'ল www.identrust.com , তবে এটি সেই ডোমেনটি নয় যা আমি সংযোগের চেষ্টা করছিলাম। এই ডোমেনটি এই সরবরাহকারীর কাছ থেকে এর শংসাপত্র অর্জন করেছে। জেডিকে / জেআরই-তে ডিফল্ট তালিকার মাধ্যমে ক্রস রুট কভার বিশ্বাসটি দেখুন ? - একটি দম্পতি এন্ট্রি পড়ুন। আরো দেখুন কোন ব্রাউজার এবং অপারেটিং সিস্টেম আসুন এনক্রিপ্ট সমর্থন

সুতরাং, আমি আগ্রহী এমন ডোমেনের সাথে সংযোগ স্থাপনের জন্য, যা থেকে identrust.comআমার শংসাপত্র জারি করা হয়েছিল নিম্নলিখিত পদক্ষেপগুলি করেছে। মূলত, আমি DST Root CA X3জেভিএম দ্বারা বিশ্বাসযোগ্য হতে পরিচয় ডটকম ( ) শংসাপত্র পেতে হয়েছিল। আমি অ্যাপাচি এইচটিপিপি কম্পোনেন্টগুলি 4.5 ব্যবহার করে তা করতে সক্ষম হয়েছি:

1: শংসাপত্র চেইন ডাউনলোডের নির্দেশাবলীতে indettrust থেকে শংসাপত্র পান । ডিএসটি রুট সিএ এক্স 3 লিঙ্কটিতে ক্লিক করুন ।

2: "ডিএসটি রুট সিএ এক্স 3.pem" নামের একটি ফাইলটিতে স্ট্রিংটি সংরক্ষণ করুন। প্রারম্ভিক এবং শেষে ফাইলটিতে "----- শুরু করুন শংসাপত্র -----" এবং "----- সমাপ্তি প্রত্যয় -----" লাইন যুক্ত করার বিষয়ে নিশ্চিত হন।

3: নিম্নলিখিত কমান্ড সহ একটি জাভা কীস্টোর ফাইল তৈরি করুন, cacerts.jks:

keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword

4: ফলস্বরূপ cacerts.jks কীস্টোরটি আপনার জাভা / (maven) অ্যাপ্লিকেশনটির সংস্থান ডিরেক্টরিতে অনুলিপি করুন।

5: এই ফাইলটি লোড করতে এবং অ্যাপাচি 4.5 এইচটিটিপি ক্লায়েন্টের সাথে সংযুক্ত করার জন্য নিম্নলিখিত কোডটি ব্যবহার করুন। এটি এমন সমস্ত ডোমেনের সমস্যার সমাধান করবে যা থেকে শংসাপত্র জারি করা হয়েছেindetrust.com ইউরাক ওরাকল করা হয়েছে তাদের জেআরই ডিফল্ট কীস্টোরের শংসাপত্র অন্তর্ভুক্ত করবে solve

SSLContext sslcontext = SSLContexts.custom()
        .loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
                new TrustSelfSignedStrategy())
        .build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
        sslcontext,
        new String[] { "TLSv1" },
        null,
        SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
        .setSSLSocketFactory(sslsf)
        .build();

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

তথ্যসূত্র: কাস্টম এসএসএল প্রসঙ্গে এবং আমি কীভাবে জাভা এইচটিপিএসর URL সংযোগের সাথে স্ব-স্বাক্ষরিত শংসাপত্র গ্রহণ করব?


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

4
প্রশ্নটি (এবং উত্তর) কিছুটা কাছে পড়ুন।
নিকোলাস

9

অ্যাপাচি এইচটিপিএল ক্লায়েন্ট 4.5 স্ব-স্বাক্ষরিত শংসাপত্রগুলি গ্রহণ করার পক্ষে সমর্থন করে:

SSLContext sslContext = SSLContexts.custom()
    .loadTrustMaterial(new TrustSelfSignedStrategy())
    .build();
SSLConnectionSocketFactory socketFactory =
    new SSLConnectionSocketFactory(sslContext);
Registry<ConnectionSocketFactory> reg =
    RegistryBuilder.<ConnectionSocketFactory>create()
    .register("https", socketFactory)
    .build();
HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg);        
CloseableHttpClient httpClient = HttpClients.custom()
    .setConnectionManager(cm)
    .build();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse sslResponse = httpClient.execute(httpGet);

এটি একটি এসএসএল সকেট কারখানা তৈরি করে যা এটি ব্যবহার করবে TrustSelfSignedStrategy , এটি একটি কাস্টম সংযোগ ব্যবস্থাপকের সাথে নিবন্ধিত করে তারপরে এই সংযোগ ব্যবস্থাপকটি ব্যবহার করে কোনও HTTP GET করে।

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


6

ডিফল্ট সকেট কারখানাটি স্থাপন করার পরিবর্তে (যা আইএমও একটি খারাপ জিনিস) - আপনি যে SSL টি সংযোগটি খোলার চেষ্টা করছেন তার চেয়ে এখনকার সংযোগটি প্রভাবিত করবে:

URLConnection connection = url.openConnection();
    // JMD - this is a better way to do it that doesn't override the default SSL factory.
    if (connection instanceof HttpsURLConnection)
    {
        HttpsURLConnection conHttps = (HttpsURLConnection) connection;
        // Set up a Trust all manager
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager()
        {

            public java.security.cert.X509Certificate[] getAcceptedIssuers()
            {
                return null;
            }

            public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs, String authType)
            {
            }

            public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs, String authType)
            {
            }
        } };

        // Get a new SSL context
        SSLContext sc = SSLContext.getInstance("TLSv1.2");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        // Set our connection to use this SSL context, with the "Trust all" manager in place.
        conHttps.setSSLSocketFactory(sc.getSocketFactory());
        // Also force it to trust all hosts
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };
        // and set the hostname verifier.
        conHttps.setHostnameVerifier(allHostsValid);
    }
InputStream stream = connection.getInputStream();

2
আপনার checkServerTrustedসত্যিকারের শংসাপত্রকে বিশ্বাস করতে এবং অবিশ্বাস্য শংসাপত্রগুলি প্রত্যাখ্যানযোগ্য তা নিশ্চিত করার জন্য প্রয়োজনীয় যুক্তি বাস্তবায়ন করে না । এটি কিছু ভাল পড়তে পারে: বিশ্বের সবচেয়ে বিপজ্জনক কোড: নন-ব্রাউজার সফ্টওয়্যারটিতে এসএসএল শংসাপত্রগুলি বৈধকরণ
jww

1
আপনার getAcceptedIssuers()পদ্ধতিটি সুনির্দিষ্টতার সাথে সামঞ্জস্য করে না এবং এই 'সমাধান' মূলত নিরাপত্তাহীন থেকে যায়।
লার্নের মারকুইস

3

সমস্ত শংসাপত্রের উপর আস্থা রাখার আরও ভাল বিকল্প রয়েছে: TrustStoreনির্দিষ্টভাবে প্রদত্ত শংসাপত্রের উপর নির্ভর করে এমন একটি তৈরি SSLContextকরুন SSLSocketFactoryএবং এটিতে সেটটি পেতে কোনওটি তৈরি করতে এটি ব্যবহার করুন HttpsURLConnection। এখানে সম্পূর্ণ কোড:

File crtFile = new File("server.crt");
Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream(crtFile));

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("server", certificate);

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());

আপনি বিকল্পভাবে KeyStoreকোনও ফাইল থেকে সরাসরি লোড করতে পারেন বা কোনও বিশ্বস্ত উত্স থেকে X.509 শংসাপত্রটি পুনরুদ্ধার করতে পারেন।

নোট করুন যে এই কোড সহ, শংসাপত্রগুলি cacertsব্যবহার করা হবে না। এই নির্দিষ্টটি HttpsURLConnectionকেবল এই নির্দিষ্ট শংসাপত্রকে বিশ্বাস করবে।


1

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

public static class NukeSSLCerts {
protected static final String TAG = "NukeSSLCerts";

public static void nuke() {
    try {
        TrustManager[] trustAllCerts = new TrustManager[] { 
            new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() {
                    X509Certificate[] myTrustedAnchors = new X509Certificate[0];  
                    return myTrustedAnchors;
                }

                @Override
                public void checkClientTrusted(X509Certificate[] certs, String authType) {}

                @Override
                public void checkServerTrusted(X509Certificate[] certs, String authType) {}
            }
        };

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        });
    } catch (Exception e) { 
    }
}

}

ক্রিয়াকলাপে বা আপনার অ্যাপ্লিকেশন ক্লাসে এই ক্রিয়াকলাপটি অনক্রিট () ফাংশনে কল করুন।

NukeSSLCerts.nuke();

এটি অ্যান্ড্রয়েডে ভলির জন্য ব্যবহার করা যেতে পারে।


কোডটি কাজ না করে আপনি কেন ভোটে নামাচ্ছেন তা সম্পূর্ণরূপে নিশ্চিত নয়। সম্ভবত এটি অনুমান করা হয় যে মূল প্রশ্নটি যখন অ্যান্ড্রয়েডকে ট্যাগ করে না তখন অ্যান্ড্রয়েড কোনওভাবে জড়িত।
লো-টান

1

গৃহীত উত্তরটি ঠিক আছে, তবে আমি ম্যাকের উপর ইন্টেলিজ ব্যবহার করছিলাম এবং JAVA_HOMEপথ চলকটি ব্যবহার করে এটির কাজ করতে পারি নি বলে আমি এতে কিছু যুক্ত করতে চাই ।

এটি দেখা যাচ্ছে যে ইন্টেলিজিজ থেকে অ্যাপ্লিকেশনটি চালানোর সময় জাভা হোম আলাদা ছিল।

এটি ঠিক কোথায় আছে তা খুঁজে বের করার জন্য, আপনি ঠিক সেখানেই করতে পারেন System.getProperty("java.home")যেখানে বিশ্বস্ত শংসাপত্রগুলি পড়ে।


0

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

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


2
কিছু সার্ভার https ব্যবহার করার সিদ্ধান্ত নিয়েছে বলেই এর অর্থ এই নয় যে ক্লায়েন্ট সহ ব্যক্তিটি তাদের নিজস্ব উদ্দেশ্যে সুরক্ষা সম্পর্কে একটি বাজেয়া দেয়।
গাস

3
আমি অবাক হয়েছি এই উত্তরটি এতটা কমিয়ে দেওয়া হয়েছে। আমি কেন আরও কিছুটা বুঝতে আগ্রহী। দেখে মনে হচ্ছে ইজেপি আপনাকে পরামর্শ দিচ্ছে যে বিকল্প 2 করা উচিত নয় কারণ এটি একটি বড় সুরক্ষা ত্রুটির জন্য অনুমতি দেয়। কেউ উত্তর দিতে পারে কেন (প্রাক-স্থাপনার সেটিংস ব্যতীত) কেন এই উত্তরটি নিম্নমানের?
cr1pto

2
ঠিক আছে, আমি এটি সব অনুমান। কি করে "এটা তাদের আপ হয় নেওয়া পদক্ষেপ তাদের সার্ভার ব্যবহারযোগ্য করতে প্রয়োজন বোধ করা" মানে? সার্ভার অপারেটরকে এটিকে ব্যবহারযোগ্য করে তোলার জন্য কী করতে হবে? আপনার মনে পদক্ষেপগুলি কী কী? আপনি তাদের একটি তালিকা সরবরাহ করতে পারেন? তবে এক হাজার ফুট পিছনে পা রেখে, কীভাবে এটি ওপি জিজ্ঞাসা করা সমস্যার সাথে কীভাবে সম্পর্কিত? তিনি কীভাবে ক্লায়েন্টকে জাভায় স্ব-স্বাক্ষরিত শংসাপত্রটি গ্রহণ করতে পারেন তা জানতে চান। ওপি শংসাপত্রটি গ্রহণযোগ্য বলে আবিষ্কার করার পরে এটি কোডের প্রতি আস্থা অর্জনের একটি সহজ বিষয়।
jww

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

3
@ এজেপি - আমি অবশ্যই বলিনি, "সমস্ত শংসাপত্রগুলিতে বিশ্বাস করুন" । সম্ভবত আমি কিছু মিস করছি (বা আপনি জিনিসগুলিতে খুব বেশি পড়ছেন) ... ওপিতে শংসাপত্র রয়েছে এবং এটি তার কাছে গ্রহণযোগ্য। তিনি কীভাবে এটি বিশ্বাস করতে চান তা জানতে চায়। আমি সম্ভবত চুলগুলি বিভক্ত করছি, তবে শংসাপত্রটি অফলাইনে সরবরাহ করার দরকার নেই। একটি আউট-ব্যান্ড যাচাইকরণ ব্যবহার করা উচিত, তবে এটি "ক্লায়েন্টকে অফলাইনে পৌঁছে দিতে হবে" এর মতো নয় । এমনকি সে সার্ভার এবং ক্লায়েন্ট উত্পাদনকারী দোকানও হতে পারে, তাই তার প্রয়োজনীয় অগ্রাধিকার জ্ঞান রয়েছে।
jww

0

এটি সম্পূর্ণ সমস্যার সমাধান নয় তবে কী কীটোলটি কীভাবে ব্যবহার করবেন সে সম্পর্কে ওরাকলে ভাল বিস্তারিত ডকুমেন্টেশন রয়েছে। এটি কিভাবে তা ব্যাখ্যা করে

  1. কীটোল ব্যবহার করুন।
  2. কীটল ব্যবহার করে শংসাপত্র / স্বাক্ষরিত শংসাপত্রগুলি তৈরি করুন।
  3. জাভা ক্লায়েন্টগুলিতে উত্পন্ন উত্সগুলি আমদানি করুন।

https://docs.oracle.com/cd/E54932_01/doc.705/e54936/cssg_create_ssl_cert.htm#CSVSG178


0

শীর্ষ মন্তব্য দ্বারা প্রস্তাবিত কীটল ব্যবহারের পরিবর্তে, আরএইচইএল-তে আপনি রিয়েল 6 এর নতুন সংস্করণে শুরু করে আপডেট-সিএ-বিশ্বাস ব্যবহার করতে পারেন You আপনার কাছে পেয়ার ফর্ম্যাটে সার্ট থাকতে হবে। তারপর

trust anchor <cert.pem>

/Etc/pki/ca-trust/source/cert.p11- কিট সম্পাদনা করুন এবং "শংসাপত্র বিভাগ: অন্যান্য-এন্ট্রি" "শংসাপত্র বিভাগ: কর্তৃপক্ষ" এ পরিবর্তন করুন। (বা স্ক্রিপ্টে এটি করার জন্য সেড ব্যবহার করুন)) তারপরে করুন

update-ca-trust

একটি দম্পতি সতর্কতা:

  • আমি আমার RHEL 6 সার্ভারে "বিশ্বাস" খুঁজে পাইনি এবং আপনি এটি ইনস্টল করার প্রস্তাব দিচ্ছেন না didn't আমি এটি একটি RHEL 7 সার্ভারে ব্যবহার করে এবং .p11-কিট ফাইলটি অনুলিপি করে শেষ করেছি।
  • আপনার জন্য এই কাজটি করতে, আপনার প্রয়োজন হতে পারে update-ca-trust enable । এটি / etc / pki / java / cacerts কে প্রতিলিঙ্কযুক্ত লিঙ্ক / / etc / pki / ca-trust / নিষ্কাশন / java / cacerts এ প্রতিস্থাপন করবে। (সুতরাং আপনি প্রাক্তনটিকে প্রথমে ব্যাক আপ করতে চাইতে পারেন))
  • যদি আপনার জাভা ক্লায়েন্টটি অন্য কোনও স্থানে সঞ্চিত ক্যাসর্ট ব্যবহার করে, আপনি নিজে এটির সাথে / etc / pki / ca-trust / extected / java / cacerts এ একটি সিমিলিঙ্কটি পরিবর্তন করতে বা ফাইলটি দিয়ে প্রতিস্থাপন করতে চাইবেন।

0

আমার ইস্যুটি ছিল যে আমি একটি লাইব্রেরিতে একটি ইউআরএল দিয়ে যাচ্ছিলাম যা url.openConnection();আমি জন-ড্যানিয়েলের উত্তরটি অভিযোজিত বলে ডাকছিলাম,

public class TrustHostUrlStreamHandler extends URLStreamHandler {

    private static final Logger LOG = LoggerFactory.getLogger(TrustHostUrlStreamHandler.class);

    @Override
    protected URLConnection openConnection(final URL url) throws IOException {

        final URLConnection urlConnection = new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile()).openConnection();

        // adapated from
        // /programming/2893819/accept-servers-self-signed-ssl-certificate-in-java-client
        if (urlConnection instanceof HttpsURLConnection) {
            final HttpsURLConnection conHttps = (HttpsURLConnection) urlConnection;

            try {
                // Set up a Trust all manager
                final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {

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

                    @Override
                    public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
                    }

                    @Override
                    public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
                    }
                } };

                // Get a new SSL context
                final SSLContext sc = SSLContext.getInstance("TLSv1.2");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                // Set our connection to use this SSL context, with the "Trust all" manager in place.
                conHttps.setSSLSocketFactory(sc.getSocketFactory());
                // Also force it to trust all hosts
                final HostnameVerifier allHostsValid = new HostnameVerifier() {
                    @Override
                    public boolean verify(final String hostname, final SSLSession session) {
                        return true;
                    }
                };

                // and set the hostname verifier.
                conHttps.setHostnameVerifier(allHostsValid);

            } catch (final NoSuchAlgorithmException e) {
                LOG.warn("Failed to override URLConnection.", e);
            } catch (final KeyManagementException e) {
                LOG.warn("Failed to override URLConnection.", e);
            }

        } else {
            LOG.warn("Failed to override URLConnection. Incorrect type: {}", urlConnection.getClass().getName());
        }

        return urlConnection;
    }

}

এই শ্রেণিটি ব্যবহার করে এটি দিয়ে একটি নতুন ইউআরএল তৈরি করা সম্ভব:

trustedUrl = new URL(new URL(originalUrl), "", new TrustHostUrlStreamHandler());
trustedUrl.openConnection();

এটির সুবিধা রয়েছে যে এটি স্থানীয়ীকৃত এবং ডিফল্টটি প্রতিস্থাপন করছে না URL.openConnection

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