2010-05-26 14 views
6

मैं HTTP अनुरोध कैसे कर सकता हूं और जावा का उपयोग कर X.509 प्रमाणपत्र के साथ साइन इन कर सकता हूं?जावा में X.509 प्रमाण पत्र के साथ मैं HTTP अनुरोध पर हस्ताक्षर कैसे करूं?

मैं आमतौर पर सी # में प्रोग्राम करता हूं।

private HttpWebRequest CreateRequest(Uri uri, X509Certificate2 cert) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
    request.ClientCertificates.Add(cert); 
    /* ... */ 
    return request; 
} 

जावा में मैं एक java.security.cert.X509Certificate उदाहरण बनाया है, लेकिन मैं समझ नहीं है कि यह कैसे एक HTTP अनुरोध करने के लिए संबद्ध करने के लिए: अब, मुझे क्या करना चाहते हैं केवल जावा में निम्नलिखित के लिए कुछ इसी तरह, है। मैं java.net.URL उदाहरण का उपयोग कर एक HTTP अनुरोध बना सकता हूं, लेकिन मुझे लगता है कि मैं अपने प्रमाण पत्र को उस उदाहरण के साथ जोड़ नहीं सकता (और मुझे यकीन नहीं है कि java.net.URL का उपयोग करना भी उचित है)।

+0

इन सुझावों में से किसी काम किया? – jasonmp85

उत्तर

1

मैं अपाचे कॉमन्स से ओपन सोर्स HttpClient लाइब्रेरी की अनुशंसा करता हूं। इस उपयोग के मामले और कई अन्य को कवर करता है।

+0

404 नहीं मिला ... – Tomas

+1

फिक्स्ड। आशा करता हूँ की ये काम करेगा! –

2

मैं सी # प्रोग्रामर नहीं हूं, लेकिन मुझे लगता है कि कोड HTTPS/TLS का उपयोग करके कॉल करता है और प्रमाणीकरण के लिए क्लाइंट प्रमाणपत्र प्रदान करता है? उर्फ, आप नहीं पूछ रहे हैं कि डब्ल्यूएस-सिक्योरिटी का उपयोग कैसे करें, है ना?

उस स्थिति में, मुझे लगता है कि उत्तर here और here आपके लिए उपयोग किए जाएंगे। आपको अपने प्रमाणपत्र को पी 12 क्लाइंट कीस्टोर में आयात करने के लिए एक openssl उपयोगिता का उपयोग करने की आवश्यकता है। यदि आपका सर्वर गैर-मानक सीए या स्वयं-हस्ताक्षरित प्रमाणपत्र का उपयोग कर रहा है, तो आपको उन प्रमाणपत्रों के साथ क्लाइंट ट्रस्टस्टोर भी सेट अप करना होगा।

इस बिंदु पर, मेरे द्वारा लिंक किए गए प्रश्नों को देखें: आपको पूरी तरह से JVM तर्कों को निर्दिष्ट करने की आवश्यकता होगी। अंत में, अपनी कॉल फिर से करने का प्रयास करें (मानक जावा ऑब्जेक्ट्स या httpclient का उपयोग करके)। यदि आपका ट्रस्टस्टोर सही है और सर्वर को क्लाइंट प्रमाण के लिए पूछना चाहिए तो क्लाइंट को सर्वर प्रमाण स्वीकार करना चाहिए। यदि आपका कीस्टोर सही तरीके से स्थापित है, तो क्लाइंट X.50 9 क्लाइंट प्रमाण पत्र के साथ प्रमाणित है और आप जाने के लिए अच्छे होंगे।

1

ऐसा लगता है कि आप क्लाइंट-प्रमाणपत्र प्रमाणीकरण के साथ HTTPS का उपयोग करने का प्रयास कर रहे हैं। मुझे लगता है कि आपका सर्वर इस अनुरोध के लिए कॉन्फ़िगर किया गया है (क्योंकि क्लाइंट प्रमाणपत्र केवल सर्वर द्वारा अनुरोध किया जा सकता है)।

जावा में, java.security.cert.X509Certificate वास्तव में केवल प्रमाण पत्र (निजी कुंजी प्रमाण पत्र, निजी कुंजी के बिना) है। ग्राहक पक्ष पर आपको जो चाहिए वह निजी कुंजी को इसके साथ कॉन्फ़िगर करना है। मान लीजिए कि आपकी निजी कुंजी और प्रमाणपत्र एक कीस्टोर में हैं (सरल बनाने के लिए, मुझे लगता है कि इसकी निजी कुंजी के साथ केवल एक उपयुक्त प्रमाण पत्र है, शायद उस कुंजीस्टोर में श्रृंखला में अन्य प्रमाणपत्रों के साथ), और आप इसका उपयोग कर रहे हैं डिफ़ॉल्ट विश्वास की दुकान:

KeyStore ks = ... 
/* load the keystore */ 

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
kmf.init(ks, password); 

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(kmf.getKeyManagers(), null, null); 

URL url = new URL("https://example/"); 
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); 

connection.setSSLSocketFactory(sslContext.getSSLSocketFactory()); 

अन्य पुस्तकालयों आप SSLContext या KeyStore थोड़ा अलग ढंग से निर्धारित करने की अनुमति होगी, लेकिन सिद्धांतों ही होना चाहिए।

(तुम भी javax.net.ssl.keyStore प्रणाली गुण इस्तेमाल कर सकते हैं अगर यह उचित है।)

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