ट्रस्ट स्टोर बनाम की-स्टोर - कीटूल के साथ निर्माण


249

मैं समझता हूं कि कीस्टोर आमतौर पर निजी / सार्वजनिक कुंजी और ट्रस्ट स्टोर केवल सार्वजनिक कुंजी (और उन विश्वसनीय पार्टियों की सूची का प्रतिनिधित्व करता है जिन्हें आप के साथ संवाद करने का इरादा रखते हैं)। खैर, यह मेरी पहली धारणा है, इसलिए यदि यह सही नहीं है, तो मैंने शायद बहुत अच्छी शुरुआत नहीं की है ...

मुझे यह समझने में हालांकि दिलचस्पी थी कि कैसे और जब आप कीटल का उपयोग करते समय दुकानों को अलग करते हैं।

इसलिए, अब तक मैंने काइस्टोर का उपयोग करके बनाया है

keytool -import -alias bob -file bob.crt -keystore keystore.ks

जो मेरी keystore.ks फ़ाइल बनाता है। मैं yesइस प्रश्न का उत्तर देता हूं कि मुझे बॉब पर भरोसा है लेकिन यह मेरे लिए अस्पष्ट है कि क्या इसने कीस्टोर फाइल या ट्रस्टस्टोर फाइल बनाई है? मैं फ़ाइल का उपयोग करने के लिए अपना एप्लिकेशन सेट कर सकता हूं।

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

और System.setProperty( "javax.net.debug", "ssl")सेट के साथ , मैं विश्वसनीय प्रमाणपत्रों के तहत प्रमाण पत्र देख सकता हूं (लेकिन कीस्टोर अनुभाग के तहत नहीं)। मेरे द्वारा आयात किए जा रहे विशेष प्रमाणपत्र में केवल एक सार्वजनिक कुंजी है और मैं इसका उपयोग बॉब से एसएसएल कनेक्शन पर सामान भेजने के लिए करना चाहता हूं (लेकिन शायद यह किसी अन्य प्रश्न के लिए सबसे अच्छा है!)।

किसी भी संकेत या स्पष्टीकरण की बहुत सराहना की जाएगी। क्या आप जो कुछ भी आयात करते हैं और जो सिर्फ एक कन्वीनर है और एक ट्रस्ट स्टोर है, उसे कहते हैं, तो क्या केटुल का आउटपुट समान है? एसएसएल आदि का उपयोग करते समय क्या संबंध है?


मुझे यकीन नहीं है कि आपके द्वारा "जो विशेष प्रमाणपत्र मैं आयात कर रहा हूं उसका केवल एक सार्वजनिक कुंजी है" से क्या मतलब है: क्या यह सिर्फ एक सार्वजनिक कुंजी है (यानी प्रमाण पत्र नहीं) या गैर-सीए प्रमाण पत्र?
ब्रूनो

हम्म, यकीन नहीं होता। मैंने अपने ब्राउज़र से PEM फ़ाइल के रूप में निर्यात किया है। क्या उससे मदद हुई?
टॉबी

यदि इसे ब्राउज़र से निर्यात किया जाता है, तो यह संभवतः एक प्रमाण पत्र है। क्या यह एक सर्वर सर्टिफिकेट (CN या subjectAltName के साथ सर्वर के नाम से मेल खाता है)? क्या यह एक CA प्रमाणपत्र है (मूल बाधाओं के तहत देखें, आपको अपने ब्राउज़र का उपयोग करके यह देखने में सक्षम होना चाहिए)।
ब्रूनो

2
tl; dr: ट्रस्ट स्टोर्स में पब्लिक, ट्रस्टेड, रूट (CA) सेर्ट्स होते हैं, जबकि पहचान / कुंजी स्टोर्स में प्राइवेट, आइडेंटिटी सीट्स होते हैं; फ़ाइल-वार, हालांकि, वे समान हैं।
एंड्रयू

जवाबों:


346

शब्दावली थोड़ा वास्तव में भ्रामक है, लेकिन दोनों javax.net.ssl.keyStoreऔर javax.net.ssl.trustStoreनिर्दिष्ट करने के लिए उपयोग किया जाता है जो उपयोग करने के लिए keystores, दो अलग अलग उद्देश्यों के लिए। कीस्टोर्स विभिन्न स्वरूपों में आते हैं और जरूरी फाइलें भी नहीं हैं ( यह सवाल देखें ), और keytoolउन पर विभिन्न कार्यों (आयात / निर्यात / सूची / ...) करने के लिए सिर्फ एक उपकरण है।

javax.net.ssl.keyStoreऔर javax.net.ssl.trustStoreमानकों का निर्माण करने के लिए इस्तेमाल डिफ़ॉल्ट मापदंड हैं KeyManagerऔर TrustManagerरों (क्रमशः), तो एक का निर्माण करने के लिए प्रयोग किया जाता SSLContextहै जो अनिवार्य है जब एक SSL / TLS एक के माध्यम से कनेक्शन बनाने उपयोग करने के लिए SSL / TLS सेटिंग होती हैं SSLSocketFactoryया एक SSLEngine। ये सिस्टम प्रॉपर्टीज वहीं हैं, जहां से डिफॉल्ट वैल्यूज आती हैं, जो कि तब इस्तेमाल किया जाता है SSLContext.getDefault(), SSLSocketFactory.getDefault()उदाहरण के लिए खुद इस्तेमाल किया जाता है । (यह सब एपीआई के माध्यम से कई स्थानों पर अनुकूलित किया जा सकता है, यदि आप डिफ़ॉल्ट मानों का उपयोग नहीं करना चाहते हैं और यह SSLContextकिसी दिए गए उद्देश्य के लिए विशिष्ट है ।)

KeyManagerऔर TrustManager(और इस प्रकार javax.net.ssl.keyStoreऔर javax.net.ssl.trustStore) के बीच का अंतर इस प्रकार है ( JSSE रेफरी गाइड से उद्धृत ))

TrustManager: निर्धारित करता है कि दूरस्थ प्रमाणीकरण क्रेडेंशियल (और इस प्रकार कनेक्शन) पर भरोसा किया जाना चाहिए।

KeyManager: यह निर्धारित करता है कि दूरस्थ होस्ट को भेजने के लिए कौन सा प्रमाणीकरण क्रेडेंशियल है।

(अन्य पैरामीटर उपलब्ध हैं और उनके डिफ़ॉल्ट मान JSSE रेफरी गाइड में वर्णित हैं । ध्यान दें कि ट्रस्ट स्टोर के लिए एक डिफ़ॉल्ट मान है, लेकिन कुंजी स्टोर के लिए एक नहीं है।)

अनिवार्य रूप से, कीस्टॉर javax.net.ssl.keyStoreका मतलब आपकी निजी कुंजियों और प्रमाणपत्रों javax.net.ssl.trustStoreसे युक्त होता है , जबकि इसका मतलब यह होता है कि जब आप एक दूरस्थ पार्टी अपना प्रमाणपत्र प्रस्तुत करते हैं तो आप उन सीए प्रमाणपत्रों पर भरोसा कर सकते हैं, जिन पर आप विश्वास करना चाहते हैं। कुछ मामलों में, वे एक और एक ही स्टोर हो सकते हैं, हालांकि यह अक्सर अलग-अलग स्टोर (विशेषकर जब वे फ़ाइल-आधारित होते हैं) का उपयोग करने के लिए बेहतर अभ्यास होता है।


उत्तर के लिए धन्यवाद, यह चीजों को थोड़ा साफ करता है। मैं अभी भी उलझन में हूँ क्योंकि जब यह उपयोग की बात आती है, तो मैं एक kystore (via -D) के रूप में pk12 pri / pub key (xxx.p12) का उपयोग कर सकता हूं और बिना किसी ट्रस्टस्टॉर के किसी भी उल्लेख के बिना एक SSL कनेक्शन (विश्वसनीय) बना सकता हूं - D ... ओह अच्छा।
टॉबी

57
आपको एक ट्रस्टस्टोर निर्दिष्ट करने की आवश्यकता नहीं है, क्योंकि इसके लिए एक डिफ़ॉल्ट मान है (यह जेआरई के साथ बंडल है), आमतौर पर $JAVA_HOME/lib/security/cacerts(2 जेएसएसई रेफरी गाइड लिंक जिसे मैंने भेजा था) देखें। ब्राउज़रों की तरह, इसमें विश्वसनीय CA प्रमाणपत्रों का डिफ़ॉल्ट सेट होता है। सामान्य तौर पर, एक क्लाइंट हमेशा सर्वर सर्टिफिकेट की जांच करने के लिए एक ट्रस्टस्टोर का उपयोग करेगा, लेकिन कीस्टॉर का उपयोग केवल तभी किया जाएगा जब सर्वर क्लाइंट सर्टिफिकेट का अनुरोध करता है, और सर्वर हमेशा कीस्ट सर्टिफिकेट का उपयोग अपने कुंजी + सर्टिफिकेट के लिए करेगा, लेकिन ट्रस्टस्टोर केवल तभी होगा उपयोग किया जाता है, यदि क्लाइंट क्लाइंट प्रमाणपत्र भेजता है।
ब्रूनो

2
उपयोगी जानकारी के लिए धन्यवाद। वेबलॉजिक में, "पहचान-कुंजी-स्टोर" है जो सर्वर के एसएसएल प्रमाणपत्र को संग्रहीत करता है और फिर "ट्रस्ट-की-स्टोर" है जो एसएसएल प्रमाणपत्रों को संग्रहीत करता है जो सर्वर पर भरोसा करता है, इसलिए मैं सही हूं यदि मैं कहता हूं कि "पहचान-कुंजी -स्टोर "एक" कीस्टोर "और" ट्रस्ट-की-स्टोर "कुछ भी नहीं है, लेकिन" ट्रस्टस्टोर "कुछ भी नहीं है?
हग्रावल

@ ब्रूनो को हमें यह भी ध्यान देना चाहिए कि जब "जैस्सेकेर्ट" होता है, तो "कैसर्ट" को अनदेखा किया जाता है?
kommradHomer

61

सामान्य उपयोग / उद्देश्य या आम रास्ते में समझाने के लिए:

TrustStore : जैसा कि नाम से संकेत मिलता है, इसकी सामान्य रूप से विश्वसनीय संस्थाओं के प्रमाण पत्र को संग्रहीत करने के लिए उपयोग किया जाता है। एक प्रक्रिया अपने सभी विश्वसनीय पक्षों के प्रमाण पत्र का एक स्टोर बनाए रख सकती है जिस पर वह भरोसा करता है।

keyStore : हस्ताक्षरित प्रमाणपत्र के साथ सर्वर कुंजी (सार्वजनिक और निजी दोनों) को संग्रहीत करने के लिए उपयोग किया जाता है।

SSL हैंडशेक के दौरान,

  1. एक ग्राहक https: // का उपयोग करने की कोशिश करता है

  2. और इस प्रकार, सर्वर एक एसएसएल प्रमाणपत्र प्रदान करके प्रतिक्रिया करता है (जो इसके कीस्टोर में संग्रहीत है)

  3. अब, क्लाइंट एसएसएल प्रमाणपत्र प्राप्त करता है और इसे ट्रस्टस्टोर के माध्यम से सत्यापित करता है (यानी ग्राहक के ट्रस्टस्टोर के पास पहले से ही प्रमाण-पत्र का सेट है, जिस पर वह भरोसा करता है।)। इसकी तरह: क्या मैं इस सर्वर पर भरोसा कर सकता हूं? क्या यह वही सर्वर है जिससे मैं बात करने की कोशिश कर रहा हूं? कोई बीच का आदमी हमला नहीं करता?

  4. एक बार, क्लाइंट सत्यापित करता है कि यह सर्वर से बात कर रहा है जिस पर उसे भरोसा है, फिर एसएसएल संचार एक साझा गुप्त कुंजी पर हो सकता है।

नोट: मैं सर्वर साइड पर क्लाइंट प्रमाणीकरण के बारे में यहां कुछ भी नहीं बोल रहा हूं। यदि कोई सर्वर क्लाइंट प्रमाणीकरण भी करना चाहता है, तो सर्वर क्लाइंट को सत्यापित करने के लिए एक ट्रस्टस्टोर भी रखता है।


25

कीस्टोर और ट्रस्टस्टोर फाइलों में कोई अंतर नहीं है। दोनों मालिकाना JKS फ़ाइल स्वरूप में फ़ाइलें हैं। उपयोग में अंतर है: मेरे ज्ञान के सर्वश्रेष्ठ के लिए, जावा केवल उस स्टोर का उपयोग करेगा जो -Djavax.net.ssl.trustStoreएसएसएल कनेक्शन बनाते समय विश्वास करने के लिए प्रमाणपत्र देखने के लिए सिस्टम संपत्ति द्वारा संदर्भित किया जाता है। चाबियों के लिए और -Djavax.net.ssl.keyStore। लेकिन सिद्धांत रूप में ट्रस्ट और कीस्टोर्स के लिए एक और एक ही फाइल का उपयोग करना ठीक है।


4
आप javax.net.ssl.keyStoreTypeऔर javax.net.ssl.trustStoreTypeसिस्टम गुण सेट करके विभिन्न प्रकार के कीस्टोर (जैसे, PKCS12) का उपयोग कर सकते हैं ।
डोनल फैलो

1
@ डॉनल: अच्छा जोड़। क्या आपको पता है कि सभी समर्थित कंटेनरों की सूची है? मैं केवल PKCS12 और JKS (पूर्व परीक्षण और त्रुटि का परिणाम है ...) जानता हूं।
मुसिक

2
उपलब्ध प्रदाताओं के आधार पर कीस्टोर प्रारूप भिन्न होते हैं ( डिफ़ॉल्ट रूप से Oracle JRE के साथ बंडल किए गए लोगों के लिए यह सूची देखें )। इस सवाल पर भी चर्चा हुई । अन्य प्रदाताओं (जैसे BouncyCastle) का उपयोग अन्य प्रारूपों के लिए किया जा सकता है।
ब्रूनो

21

कीस्टोर का उपयोग सर्वर द्वारा निजी कुंजी को स्टोर करने के लिए किया जाता है, और ट्रस्टस्टोर का उपयोग तीसरे पक्ष के ग्राहक द्वारा सर्वर तक पहुंच के लिए प्रदान की गई सार्वजनिक कुंजी को संग्रहीत करने के लिए किया जाता है। मैंने अपने प्रोडक्शन एप्लिकेशन में ऐसा किया है। नीचे एसएसएल संचार के लिए जावा सर्टिफिकेट बनाने के चरण दिए गए हैं:

  1. विंडोज़ में कीजन कमांड का उपयोग करके एक प्रमाण पत्र बनाएं:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. प्रमाणपत्र को स्व प्रमाणित करें:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. फ़ोल्डर में प्रमाणपत्र निर्यात करें:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. ग्राहक ट्रस्टस्टोर में प्रमाणपत्र आयात करें:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore


नमस्ते, मेरे पास एक परिदृश्य है जहां मेरे पास एक ही कंटेनर (टॉमकैट) के भीतर दो अलग-अलग अनुप्रयोग हैं। दोनों अनुप्रयोगों से, मुझे दोनों पक्षों से प्रत्येक एप्लिकेशन को बाकी समापन बिंदुओं को कॉल करना होगा। जैसे, ए से बी और बी से ए (ए और बी दो एप्लिकेशन हैं)। क्या मुझे इस परिदृश्य में ट्रस्टस्टोर का उपयोग करने की आवश्यकता है? जैसा कि मैं कस्टम रेस्ट क्लाइंट का उपयोग कर रहा हूं जो कि कीस्टोर का उपयोग कर रहा है। कृपया सुझाव दे।
दीपक

0

ये आपके स्थानीय मशीन में Keytool का उपयोग करके एक ट्रस्टस्टोर बनाने के चरण हैं। अपनी स्थानीय मशीन में URL के लिए ट्रस्टस्टोर बनाने के लिए कदम।

1) क्रोम का उपयोग करके ब्राउज़र में url मारो

2) क्रोम में url के बाईं ओर "i" आइकन के लिए जाँच करें और इसे क्लिक करें

3) प्रमाण पत्र विकल्प के लिए जाँच करें और इसे क्लिक करें और एक डायलॉग बॉक्स खुलेगा

4) ट्रस्टस्टोर बनाने के लिए उपलब्ध प्रमाणपत्रों की संख्या के लिए "प्रमाणपत्र पथ" टैब की जांच करें

5) "details" tab -> click"Copy to File" -> Give the path and the name for the certificateआप जो भी बनाना चाहते हैं , जाएं ।

6) जांचें कि क्या उसके पास मूल प्रमाण पत्र है और "5" बिंदु का पालन करें ।

7) सभी प्रमाणपत्रों के बाद ओपन कमांड प्रॉम्प्ट बनाया जा रहा है और उस पथ पर नेविगेट करें जहां आपने प्रमाण पत्र बनाए हैं।

8) प्रमाणपत्रों को जोड़ने और एक ट्रस्टस्टोर बनाने के लिए नीचे कीटेल कमांड प्रदान करें।

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) सभी प्रमाणपत्रों के लिए कीटल कमांड प्रदान करें और उन्हें ट्रस्ट स्टोर में जोड़ें।

    keytool -list -v -keystore cacerts

-1

कीस्टोर बस निजी चाबियाँ, वेश्या ट्रस्टस्टोर स्टोर सार्वजनिक कुंजी संग्रहीत करता है। आप एसएसएल संचार के लिए एक जावा प्रमाण पत्र बनाना चाहते हैं। आप विंडोज़ में कीजन कमांड का उपयोग कर सकते हैं, यह संभवतः सबसे आसान समाधान होगा।


एक ट्रस्टस्टोर स्टोर ने प्रमाणित प्रमाणपत्रों पर
लोर्ने का

-1

सबसे सरल शब्दों में:

कीस्ट्रोर का उपयोग आपके क्रेडेंशियल (सर्वर या क्लाइंट) को स्टोर करने के लिए किया जाता है, जबकि ट्रस्टस्टोर का उपयोग अन्य क्रेडेंशियल (CA से प्रमाण पत्र) को स्टोर करने के लिए किया जाता है।

जब आप एसएसएल पर सर्वर साइड सेट कर रहे होते हैं, तो कीस्टोर की जरूरत होती है, इसका उपयोग सर्वर के पहचान प्रमाण पत्र को संग्रहीत करने के लिए किया जाता है, जो सर्वर कनेक्शन पर एक क्लाइंट को प्रस्तुत करेगा, जबकि क्लाइंट की ओर से ट्रस्ट स्टोर सेटअप को कनेक्शन का काम करने के लिए होना चाहिए। यदि आप SSL पर किसी वेबसाइट से जुड़ने के लिए ब्राउजर करते हैं, तो वह अपने ट्रस्टस्टोर के खिलाफ सर्वर द्वारा प्रस्तुत प्रमाणपत्र की पुष्टि करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.