2011-06-14 21 views
171

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

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

तो, जहाँ तक मुझे एक कीस्ट्रोक

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") सेट के साथ, मैं भरोसा प्रमाणपत्र के तहत प्रमाणपत्र देख सकता है (लेकिन कुंजीस्टोर धारा के तहत)। मैं जिस विशेष प्रमाणपत्र को आयात कर रहा हूं वह केवल एक सार्वजनिक कुंजी है और मैं इसका उपयोग बॉब को एसएसएल कनेक्शन पर सामान भेजने के लिए करना चाहता हूं (लेकिन शायद यह किसी अन्य प्रश्न के लिए सबसे अच्छा छोड़ दिया गया है!)।

किसी भी पॉइंटर्स या स्पष्टीकरण की सराहना की जाएगी। क्या आप जो कुछ भी आयात करते हैं और उसके सिर्फ एक सम्मेलन का कहना है कि एक कुंजीस्टोर है और दूसरा ट्रस्ट स्टोर है? SSL आदि का उपयोग करते समय रिश्ते क्या है?

+0

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

+0

हम्म, सुनिश्चित नहीं है। मैंने अपने ब्राउज़र से एक पीईएम फ़ाइल के रूप में निर्यात किया। क्या उससे मदद हुई? – Toby

+0

यदि यह ब्राउज़र से निर्यात किया जाता है, तो यह शायद एक प्रमाण पत्र है। क्या यह एक सर्वर प्रमाणपत्र है (एक सीएन या topicAltName सर्वर के नाम से मेल खाता है)? क्या यह एक सीए प्रमाण पत्र है (मूलभूत प्रतिबंधों के तहत देखें, आपको अपने ब्राउज़र का उपयोग करके इसे देखने में सक्षम होना चाहिए)। – Bruno

उत्तर

236

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

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

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

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

कीमैनगर: प्रमाणीकरण प्रमाण-पत्र दूरस्थ होस्ट को भेजने के लिए निर्धारित करता है।

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

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

+0

उत्तर के लिए धन्यवाद, यह चीजों को थोड़ा सा साफ़ करता है। जब भी उपयोग की बात आती है, तब भी मैं उलझन में हूं, मैं एक कीस्टोर (के माध्यम से) के रूप में एक पीके 12 प्राइ/पब कुंजी (xxx.p12) का उपयोग कर सकता हूं और ट्रस्टस्टोर के किसी भी उल्लेख के बिना एक एसएसएल कनेक्शन (भरोसेमंद) बना सकता हूं - डी ... ओह ठीक है। – Toby

+32

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

+2

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

20

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

+4

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

+1

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

+2

कुंजीस्टोर प्रारूप उपलब्ध प्रदाताओं के आधार पर भिन्न होते हैं (देखें [यह सूची] (http://download.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html) ओरेकल जेआरई के साथ बंडल किए गए लोगों के लिए डिफ़ॉल्ट रूप से)। [इस प्रश्न] में एक चर्चा भी हुई थी (http://stackoverflow.com/questions/6157550/question-on-java-keystores/6157716#6157716)। अन्य प्रदाताओं (उदाहरण के लिए BouncyCastle) का उपयोग अन्य प्रारूपों के लिए किया जा सकता है। – Bruno

5

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

  1. खिड़कियों में keygen आदेश का उपयोग कर एक प्रमाण पत्र उत्पन्न करें:

Keytool -genkey -keystore server.keystore -alias mycert-20,161,109 आरएसए -keyalg - keysize 2048 -validity 3950

  1. स्व प्रमाण पत्र प्रमाणित:

keytool -selfcert -alias मेरी प्रमाणपत्र-20161109 -keystore server.keystore -validity 3950

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

Keytool निर्यात -alias mycert-20161109 -keystore server.keystore -rfc -file mycert-20161109.cer

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

keytool -importcert -alias mycert-20,161,109 -file C: \ प्रमाणपत्र \ mycert-20,161,109 -किस्टोर। टी जंगली

-1

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

1

आम USECASE/उद्देश्य या आम आदमी तरह से व्याख्या करने के लिए:

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

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

एसएसएल हाथ मिलाना के दौरान,

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

  2. और इस तरह, सर्वर एक SSL प्रमाणपत्र प्रदान करने (जो अपने KeyStore में संग्रहित है) कर जवाब

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

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

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

संबंधित मुद्दे