2010-09-17 15 views
10

मुझे प्रमाणीकरण के लिए क्लाइंट प्रमाणपत्रों का उपयोग करने वाले सर्वर से एक यूआरएल का अनुरोध करने की आवश्यकता है और मेरे आवेदन के लिए ऐसा करने का कोई तरीका नहीं मिल सकता है।प्रमाणीकरण के लिए क्लाइंट प्रमाणपत्र की आवश्यकता वाले URL का अनुरोध कैसे करें

मेरी समस्या यह है कि जिस जावा क्लाइंट पर मैं काम कर रहा हूं वह प्रमाणपत्र फ़ाइल स्थानीय रूप से उपलब्ध है लेकिन पीसी पर प्रतिबंधों के कारण यह उस पर चल रहा है, यह एक कीस्टोर में प्रमाणपत्र स्थापित नहीं कर सकता है।

संक्षेप में, मैं सिर्फ यूआरएल के लिए उपयोग करने के लिए प्रमाण पत्र निर्दिष्ट करने में सक्षम होना चाहता हूं जिसे मुझे पुनर्प्राप्त करने की आवश्यकता है।

कोई सुझाव?

+0

क्या आपका मतलब है कि आप जावा कीस्टोर या ओएस कीस्टोर में प्रमाणपत्र स्थापित करने के खिलाफ प्रतिबंधित हैं? – Synesso

+0

मेरा मतलब था कि मैं क्लाइंट पीसी पर एक कीस्टोर नहीं बना सकता जिसे मैं कुंजी आयात कर सकता हूं - मैं इसे फ़ाइल सिस्टम पर केवल .cer फ़ाइल के रूप में एक्सेस कर सकता हूं। [जावा HTTPS क्लाइंट प्रमाणपत्र प्रमाणीकरण] की –

+0

संभावित डुप्लिकेट (http://stackoverflow.com/questions/1666052/java-https-client-certificate-authentication) – neves

उत्तर

16

यह स्पष्ट नहीं है कि आप किस प्रतिबंध के बारे में बात कर रहे हैं। अधिक विशेष रूप से, मुझे यकीन नहीं है कि आप स्थानीय प्रमाणपत्र फ़ाइल और एक कीस्टोर के बीच क्या अंतर मानते हैं। अधिकांश कीस्टोर फ़ाइल-आधारित होते हैं, इसलिए आप स्थापना प्रक्रिया की आवश्यकता के बिना फ़ाइल को सीधे इस तरह लोड करने में सक्षम हो सकते हैं। क्या JVM द्वारा उपयोग की जाने वाली सुरक्षा नीतियों से संबंधित प्रतिबंध हैं (जो आपको KeyStore एस को तत्काल करने से रोक सकते हैं)?

सबसे पहले, यह केवल ग्राहक पक्ष की आवश्यकता नहीं है, बल्कि इसकी निजी कुंजी है। अक्सर, लोग इस संदर्भ में "प्रमाण पत्र" शब्द का उपयोग दोनों के लिए करते हैं, लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी फ़ाइल में निजी कुंजी के बिना प्रमाणपत्र नहीं है। आम तौर पर, आपको पीकेसीएस # 12 फ़ाइल (.p12/.pfx) में निजी कुंजी + प्रमाणपत्र का संयोजन मिलेगा, इस प्रारूप में कई टूल आयात/निर्यात; यह मूल रूप से सूर्य जेवीएम द्वारा समर्थित एक कीस्टोर प्रारूप भी है (टाइप PKCS12)।

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

जेवीएम पर वैश्विक स्तर पर कीस्टोर सेट अप करने के लिए (जो आपके प्रतिबंध आपको करने के लिए रोक सकता है), आप javax.net.ssl.keyStorejavax.net.ssl.keyStorePassword (और संबंधित) सिस्टम गुण सेट कर सकते हैं। (क्योंकि पासवर्ड दिखाई दे सकता है, कमांड लाइन पर ऐसा नहीं करना बेहतर है)।

ये सिस्टम गुण (SSLSocketFactory और फिर SSLSocket, उन गुणों के साथ प्रारंभ निर्माण करने के लिए इस तरह के HttpsURLConnection के रूप में है, जो प्रयोग किया जाता है, अक्सर पारदर्शी रूप से पुस्तकालयों या वर्गों द्वारा) डिफ़ॉल्ट SSLContext के विन्यास के लिए उपयोग किया जाता है।

आप अपनी फ़ाइल से विशेष रूप से उस कनेक्शन के लिए उपयोग के लिए SSLContext बना सकते हैं। SSLContextSSLSocketFactory या SSLEngine के लिए प्रभावी रूप से एक कारखाना है, और आप दिए गए HttpsURLConnection में SSLSocketFactory सेट कर सकते हैं।

निम्नलिखित आपके कुंजीस्टोर के रूप में "/path/to/file.p12" का उपयोग करके SSLContext का निर्माण करेगा (जो आपकी निजी कुंजी और प्रमाणपत्र है जिसे आप भेजने जा रहे हैं) और डिफ़ॉल्ट सेटिंग्स को रखें ट्रस्टस्टोर (आपको इनपुट स्ट्रीम के लिए भी अपवाद पकड़ना होगा)।

KeyStore ks = KeyStore.getInstance("PKCS12"); 
FileInputStream fis = new FileInputStream("/path/to/file.p12"); 
ks.load(fis, "password".toCharArray()); 
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
kmf.init(ks, "password".toCharArray()); 
SSLContext sc = SSLContext.getInstance("TLS"); 
sc.init(kmf.getKeyManagers(), null, null); 

वहां से आप इस तरह कनेक्शन कॉन्फ़िगर कर सकते हैं (यदि यह है कि तुम क्या प्रयोग कर रहे हैं है):

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
if (connection instanceof HttpsURLConnection) { 
    ((HttpsURLConnection)connection) 
     .setSSLSocketFactory(sc.getSSLSocketFactory()); 
} 

कुछ पुस्तकालयों आप एक SSLContext सीधे पारित (अपाचे HTTP क्लाइंट 4 का समर्थन करता है दूँगी कि , और यह अपाचे HTTP क्लाइंट 3 using this के साथ किया जा सकता है।)

ध्यान दें कि कुंजीस्टोर लोड करते समय आपको सीधे पैरामीटर के रूप में पासवर्ड प्रदान करने की आवश्यकता नहीं है, तो आप कॉलबैक का उपयोग भी कर सकते हैं (शायद GUI से बेहतर दृष्टिकोण)।

शायद this library मदद कर सकता है (लेकिन यह आवश्यक नहीं है): आप इसके मददगारों के लिए KeystoreLoader का उपयोग कर सकते हैं। इस पुस्तकालयों में SSLContextFactories भी हैं (लेकिन आपको शायद किसी भी रैपर की आवश्यकता नहीं होगी क्योंकि वे ट्रस्ट प्रबंधन या कुंजी चयन को अनुकूलित करने के लिए होते हैं)।

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

+1

व्यापक विश्राम ब्रूनो के लिए धन्यवाद। –

+0

मेरे पास क्लाइंट प्रमाणीकृत करने के लिए एक .cer फ़ाइल है। जो मैं इकट्ठा कर सकता हूं उससे सिर्फ सार्वजनिक कुंजी सही है? यदि ऐसा है, तो आपके उत्तर का मतलब यह होगा कि यह काम नहीं करेगा। हालांकि, मैंने इसे ब्राउज़र में आयात किया है और इसका उपयोग कर टॉमकैट सर्वर तक पहुंच सकते हैं। कोई विचार? –

+0

आमतौर पर, .cer फ़ाइलें (अंत में, विस्तार सिर्फ एक संकेत है) केवल प्रमाण पत्र है, जो सार्वजनिक कुंजी है) होते हैं, लेकिन नहीं निजी कुंजी है, और आप अन्यथा क्लाइंट प्रमाणपत्र प्रमाणीकरण का उपयोग करने के लिए (निजी कुंजी की आवश्यकता है , कोई प्रमाण पत्र भेज सकता है और वह प्रमाणीकरण नहीं होगा)। यह संभव है कि आप टॉमकैट सर्वर वैकल्पिक क्लाइंट-प्रमाण प्रमाणीकरण का उपयोग करता है, इस मामले में यह आपको बिना किसी प्रमाण के भी अंदर देगा। आपने इस फ़ाइल को अपने ब्राउज़र में कहां आयात किया? यह क्लाइंट प्रमाणपत्र आपको कैसे जारी किया गया था? आप कौन सा ओएस उपयोग कर रहे हैं? – Bruno

1

तो आप प्रॉपर्टी के माध्यम से डिफ़ॉल्ट JSSE कुंजीस्टोर बदलने जैसे ही आप ऐप्लिकेशन, -Djavax.net.ssl.keystore=somefile आह्वान कर सकते हैं।

तो तुम एक कीस्ट्रोक में Keytool कमांड के साथ अपने प्रमाणपत्र आयात और अपने अनुप्रयोग है कि की ओर इशारा करते हैं, उदाहरण के आह्वान सकता

keytool -importcert -file mycert -keystore mystore 
java -Djavax.net.ssl.keystore=mystore ... 
+1

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

+0

धन्यवाद, लेकिन मैं फ़ाइल सिस्टम पर एक कीस्टोर का उपयोग नहीं कर सकता। –

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