2010-02-09 12 views
16

हम जावा केर्बेरोज टिकट कैश का उपयोग कर जावा एप्लिकेशन में एकल साइन ऑन सक्षम करने के लिए जेएएएस का उपयोग कर रहे हैं। हमारे jaas.conf कॉन्फ़िग फ़ाइल इस तरह दिखता है:जावा में किसी सर्वर के विरुद्ध केर्बेरोज टिकट को कैसे सत्यापित करें?

LoginJaas { 
    com.sun.security.auth.module.Krb5LoginModule required 
    useTicketCache=true 
    doNotPrompt=true 
    debug=true; 
}; 
इस के साथ

, हम एक Jaas LoginContext बना सकते हैं और सफलतापूर्वक उपयोगकर्ता के करबरोस टिकट मिलता है। हम इस टिकट को जेएमआई का उपयोग कर सर्वर एप्लिकेशन पर भेजते हैं। हम जो भी करने के लिए प्रबंधन नहीं करते हैं, वह सर्वर पर सत्यापित करना है कि केर्बेरोज टिकट वास्तव में हमारी सक्रिय निर्देशिका द्वारा बनाया गया था।

फिलहाल, हम यह जांच कर टिकट की एक बहुत ही असुरक्षित सत्यापन करते हैं कि सर्वर प्रिंसिपल (KerberosTicket.getServer()) नाम का दायरा हिस्सा हमारे डोमेन नाम में है। लेकिन निश्चित रूप से, कोई भी एक ही क्षेत्र के नाम के साथ अपना खुद का केर्बेरोज सर्वर स्थापित कर सकता है और एप्लिकेशन को शुरू करने के लिए उस टिकट का उपयोग कर सकता है।

एक विचार जो मैंने पाया है वह केर्बेरोज टिकट का उपयोग कर सक्रिय निर्देशिका एलडीएपी के खिलाफ प्रमाणित करना था। दुर्भाग्यवश, हम विंडोज 7 का उपयोग करते हैं और रजिस्ट्री प्रविष्टि सेट करते समय केवल एलडीएपी के खिलाफ प्रमाणित करने के लिए केर्बेरोज टिकट का पुनः उपयोग करते हैं (http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html देखें, allowtgtsessionkey के लिए खोजें)। यह हमारे उपयोगकर्ताओं के लिए अस्वीकार्य है।

क्या हमारे सक्रिय निर्देशिका सर्वर के खिलाफ टिकट को सत्यापित करने का कोई तरीका है? मुझे संदेह है कि यह जांचने का एक तरीका है कि क्या KerberosTicket.getServer() टिकट हमारे सर्वर के टिकट के बराबर है, लेकिन मुझे नहीं पता कि यह कैसे करना है। अद्यतन: केर्बेरोज टिकट()। GetServer() केवल एक केर्बेरोज प्रिंसिपल देता है जिसमें सर्वर टिकट नाम और दायरे के अलावा कुछ भी नहीं है, इसलिए यह सत्यापन के लिए उपयुक्त नहीं है।

आपकी मदद के लिए धन्यवाद, MEMMINGER

उत्तर

2

कोई भी वास्तव में इस के लिए एक जवाब पता लगता है के रूप में, मुझे लगता है कि हम अपने सर्वर अनुप्रयोग से बाहर एक उचित Kerberos सेवा करना है। वह जो सक्रिय निर्देशिका में लॉग इन करता है और उसके पास ServicePrincipalName विशेषता ठीक से सेट है। एसपीएनईजीओ की तरह HTTP के लिए करता है। एक अच्छा प्रारंभिक बिंदु यह कैसे करें SourceForge (http://spnego.sourceforge.net/) पर SPNEGO सर्वलेट फ़िल्टर होगा। http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html सर्विस लॉगऑन कैसे करें इसका एक बहुत अच्छा उदाहरण भी है। दुर्भाग्यवश, यह रजिस्ट्री कुंजी के साथ एक ही समस्या का कारण बनता है, इसलिए मैंने Is there a way in Java or a command-line util to obtain a Kerberos ticket for a service using the native SSPI API? पर एक नया प्रश्न पोस्ट किया।

+0

क्या आपने कभी इसे समझ लिया था? –

5

जैसा कि आपने बताया है, इसे हल करने का उचित तरीका आपकी सेवा कोर्बरराइज करना है, जो केर्बेरोज प्रोटोकॉल का पूरा बिंदु है (सर्वर के खिलाफ क्लाइंट प्रमाणित करना)। टिकट पुन: उपयोग ठीक से काम नहीं करता है क्योंकि अगर ऐसा होता है तो यह एक सुरक्षा समस्या होगी। एक केर्बेरोज सेवा को "सक्रिय निर्देशिका में लॉग इन करने" की आवश्यकता नहीं है, इसे केवल एडी के साथ साझा कुंजी की आवश्यकता है।

बीटीडब्ल्यू, जेएएएस का उपयोग करके एसएसओ प्राप्त करने के लिए उस allowtgtsessionkey सेट होने की आवश्यकता है, विंडोज़ पर इसके आसपास कोई रास्ता नहीं है।

+1

सावधान रहें कि लैटिन वर्णों के साथ सक्रिय निर्देशिका उपयोगकर्ता नाम JAAS में केर्बेरोज लॉगिन मॉड्यूल में काम नहीं करते हैं। महत्वपूर्ण सीमा जब तक कि प्रणाली केवल यूएस-एएससीआईआई नहीं है। – akirekadu

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

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