यह स्पष्ट नहीं है कि आप किस प्रतिबंध के बारे में बात कर रहे हैं। अधिक विशेष रूप से, मुझे यकीन नहीं है कि आप स्थानीय प्रमाणपत्र फ़ाइल और एक कीस्टोर के बीच क्या अंतर मानते हैं। अधिकांश कीस्टोर फ़ाइल-आधारित होते हैं, इसलिए आप स्थापना प्रक्रिया की आवश्यकता के बिना फ़ाइल को सीधे इस तरह लोड करने में सक्षम हो सकते हैं। क्या JVM द्वारा उपयोग की जाने वाली सुरक्षा नीतियों से संबंधित प्रतिबंध हैं (जो आपको KeyStore
एस को तत्काल करने से रोक सकते हैं)?
सबसे पहले, यह केवल ग्राहक पक्ष की आवश्यकता नहीं है, बल्कि इसकी निजी कुंजी है। अक्सर, लोग इस संदर्भ में "प्रमाण पत्र" शब्द का उपयोग दोनों के लिए करते हैं, लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी फ़ाइल में निजी कुंजी के बिना प्रमाणपत्र नहीं है। आम तौर पर, आपको पीकेसीएस # 12 फ़ाइल (.p12/.pfx) में निजी कुंजी + प्रमाणपत्र का संयोजन मिलेगा, इस प्रारूप में कई टूल आयात/निर्यात; यह मूल रूप से सूर्य जेवीएम द्वारा समर्थित एक कीस्टोर प्रारूप भी है (टाइप PKCS12
)।
यह काम करने के लिए, आपको उचित कीस्टोर के साथ कनेक्शन बनाने के लिए कॉन्फ़िगर करने की आवश्यकता है। एसएसएल/टीएलएस क्लाइंट-सर्टिफिकेट प्रमाणीकरण हमेशा सर्वर द्वारा शुरू किया जाता है: क्लाइंट प्रमाण पत्र के साथ जवाब देता है यदि उसके पास एक है (और इसका उपयोग करना चाहता है)। इसे किसी विशिष्ट यूआरएल के लिए कॉन्फ़िगर करने के लिए, आपको यह पता लगाना होगा कि कनेक्शन क्या बनाता है (शायद HttpsURLConnection
) और इसे वहां सेट करें (जब तक कि यह डिफ़ॉल्ट संदर्भ में सेट न हो - भले ही यह डिफ़ॉल्ट संदर्भ में सेट हो, यह केवल तभी होगा उन सर्वरों के लिए उपयोग किया जाता है जो अनुरोध करते हैं)।
जेवीएम पर वैश्विक स्तर पर कीस्टोर सेट अप करने के लिए (जो आपके प्रतिबंध आपको करने के लिए रोक सकता है), आप javax.net.ssl.keyStore
javax.net.ssl.keyStorePassword
(और संबंधित) सिस्टम गुण सेट कर सकते हैं। (क्योंकि पासवर्ड दिखाई दे सकता है, कमांड लाइन पर ऐसा नहीं करना बेहतर है)।
ये सिस्टम गुण (SSLSocketFactory
और फिर SSLSocket
, उन गुणों के साथ प्रारंभ निर्माण करने के लिए इस तरह के HttpsURLConnection
के रूप में है, जो प्रयोग किया जाता है, अक्सर पारदर्शी रूप से पुस्तकालयों या वर्गों द्वारा) डिफ़ॉल्ट SSLContext
के विन्यास के लिए उपयोग किया जाता है।
आप अपनी फ़ाइल से विशेष रूप से उस कनेक्शन के लिए उपयोग के लिए SSLContext
बना सकते हैं। SSLContext
SSLSocketFactory
या 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 भी हैं (लेकिन आपको शायद किसी भी रैपर की आवश्यकता नहीं होगी क्योंकि वे ट्रस्ट प्रबंधन या कुंजी चयन को अनुकूलित करने के लिए होते हैं)।
यह आम तौर पर कैसे का उपयोग कर एक क्लाइंट-प्रमाणपत्र कॉन्फ़िगर किया गया है, लेकिन यह है कि आपके प्रतिबंध वास्तव में कर रहे हैं (और आप किन पुस्तकालयों के प्रयोग कर रहे हैं) के बारे में स्पष्टीकरण के बिना अधिक जानकारी प्रदान करने के लिए मुश्किल है।
क्या आपका मतलब है कि आप जावा कीस्टोर या ओएस कीस्टोर में प्रमाणपत्र स्थापित करने के खिलाफ प्रतिबंधित हैं? – Synesso
मेरा मतलब था कि मैं क्लाइंट पीसी पर एक कीस्टोर नहीं बना सकता जिसे मैं कुंजी आयात कर सकता हूं - मैं इसे फ़ाइल सिस्टम पर केवल .cer फ़ाइल के रूप में एक्सेस कर सकता हूं। [जावा HTTPS क्लाइंट प्रमाणपत्र प्रमाणीकरण] की –
संभावित डुप्लिकेट (http://stackoverflow.com/questions/1666052/java-https-client-certificate-authentication) – neves