2011-09-13 21 views
12

के साथ System.Net.WebClient का उपयोग कर मेरे सी # विंडोज क्लाइंट में, मेरे पास "मातृत्व" के लिए एक पोस्ट सबमिशन है। मैं चाहता हूं कि सबमिशन में डेटा सुरक्षित हो, ज़ाहिर है, इसलिए मैंने मुझे एक एसएसएल प्रमाणपत्र जारी करने के लिए होस्टगेटर के लिए भुगतान किया।HTTPS प्रमाणपत्र

मैं .cer फ़ाइल बंद बचाया, और मैं इस तरह के रूप अनुरोध का निर्माण कर रहा हूँ:

अंतर्निहित कनेक्शन बंद कर दिया गया था:

//wrapper for WebClient object to use certificate file 
class SecureWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); 
     string certPath = @"e:\mycertificate.cer"; 
     X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath); 
     request.ClientCertificates.Add(myCert); 
     return request; 
    } 
} 

//request 
private static SecureWebClient client = new SecureWebClient(); 
private static NameValueCollection = new NameValueCollection(); 
nvc.Add(POST_ACTION, ACTION_CODE_LOGIN); 
nvc.Add(POST_EMAIL, email); 
nvc.Add(POST_PASSWORD, password); 

sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc)); 

यह एक System.Net.WebException फेंक: एक अप्रत्याशित त्रुटि एक प्रेषण पर हुई। एक अप्रत्याशित पैकेट प्रारूप की वजह से

हाथ मिलाना विफल रहा:

InnerException एक System.IO.IOException है।

मैं क्या गलत कर रहा हूं पर कोई अंतर्दृष्टि?

+0

क्या आप क्लाइंट या सर्वर पर SSL प्रमाणपत्र चाहते हैं? – SLaks

+1

स्पष्टीकरण के लिए: क्या आप संचार एन्क्रिप्टेड चाहते हैं (आपको सर्वर पर प्रमाणपत्र की आवश्यकता है)? या आप क्लाइंट को प्रमाणित करना चाहते हैं (आपको क्लाइंट प्रमाणपत्र की आवश्यकता है)? विशिष्ट होने के लिए, आपको प्रासंगिक अंत पर एक निजी कुंजी (एक .PFX फ़ाइल, शायद) की आवश्यकता होगी। –

+0

मैं सुरक्षा के तरीकों से पूरी तरह से अच्छी तरह से नहीं जानता हूं। मैं एचटीटीपीएस प्रोटोकॉल वाले ब्राउज़र में होस्ट साइट तक पहुंच सकता हूं। मैं एन्क्रिप्शन के साथ सटीक उसी सर्वर/साइट पर डेटा पोस्ट करना चाहता हूं। तो, @ एसएलएक्स - मुझे यकीन नहीं है, तकनीकी रूप से बोल रहा हूं, मैं क्या चाहता हूं। मैं बस ऊपर वर्णित जैसा कि मुझे जरूरत है कि आम आदमी में पता है। –

उत्तर

11

आप नहींग्राहक प्रमाण पत्र का उपयोग कर रहे हैं और आपने पहुँच अपने सर्वर https का उपयोग कर सकते हैं:

private static WebClient client = new WebClient(); 
private static NameValueCollection nvc= new NameValueCollection(); 

nvc.Add(POST_ACTION, ACTION_CODE_LOGIN); 
nvc.Add(POST_EMAIL, email); 
nvc.Add(POST_PASSWORD, password); 

sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc)); 

जब तक: // फिर अपने कोड की तरह दिखना चाहिए क्योंकि आपके BASE_URLhttps: // का उपयोग करता है तो सभी डेटा (सर्वर से और सर्वर) को एन्क्रिप्ट किया जाएगा।का उपयोग कर

IOW SSL/TLS सर्वर के लिए एक ग्राहक से विशेष कुछ भी (प्रमाण पत्र के साथ) करने के लिए ग्राहक की आवश्यकता नहीं है, https का उपयोग कर के अलावा: // योजना के रूप में, के बाद से ऑपरेटिंग सिस्टम सब कुछ प्रदान करता है (जैसे भरोसेमंद जड़ें) आपको डेटा ट्रांसमिशन को सुरक्षित करने की आवश्यकता है।

+0

जैसा आपने कहा था मैंने किया था --- मेरा कोड आपके द्वारा पोस्ट किए गए कोड की तरह है, और मेरा BASE_URL 'https: // www.myserver.com /' है, लेकिन मुझे सटीक त्रुटि संदेश मिल रहे हैं जैसा कि वर्णन किया गया है मूल पोस्ट _NOW_ मैं गलत क्या कर रहा हूँ? –

+1

अपनी समस्या को टुकड़ों में विभाजित करें। सबसे पहले आप अपना मुख्य पृष्ठ डाउनलोड करने के लिए वेब क्लाइंट का उपयोग करने में सक्षम हैं (https://www.myserver.com/ का उपयोग करके)? यदि यह काम नहीं करता है तो सुनिश्चित करें कि यह एक वेब ब्राउज़र से काम करता है (और पृष्ठ गुणों को जांचें ताकि यह सुनिश्चित किया जा सके कि यह एन्क्रिप्ट किया गया था)। यदि यह काम करता है तो एसएसएल के बिना अपना अपलोड कोड आज़माएं, यानी http://www.myserver.com/ पर यह सुनिश्चित करने के लिए कि यह हिस्सा काम करता है। ऐसा लगता है कि एक हिस्सा काम नहीं करेगा और यह आपको (और हमें) आपकी मदद करने के लिए कुछ संकेत देगा। – poupou

+0

'client.DownloadData (" https://www.myserver.com/ ")' _works_ का उपयोग कर। फिर 'client.UploadValues ​​(" http://www.myserver.com/ ") का उपयोग करके' _also works_। इसका क्या मतलब है? –

1

लगता है जैसे आप इसे पीछे कर रहे हैं। आपके पास वेब होस्ट/सर्वर पर एसएलएल प्रमाण पत्र स्थापित होना चाहिए। फिर आप वेब सर्वर के लिए एक वेब अनुरोध बनाते हैं और HTTPS प्रोटोकॉल की आवश्यकता होती है।

+0

मैं सुरक्षा के तरीकों से पूरी तरह से अच्छी तरह से नहीं जानता हूं। मैं एचटीटीपीएस प्रोटोकॉल वाले ब्राउज़र में होस्ट साइट तक पहुंच सकता हूं। मैं एन्क्रिप्शन के साथ सटीक उसी सर्वर/साइट पर डेटा पोस्ट करना चाहता हूं। –

4

क्लाइंट प्रमाण पत्र केवल काम करेगा यदि निजी कुंजी उपलब्ध है। यह आमतौर पर है। X.509 प्रमाणपत्र से निजी कुंजी शामिल नहीं होने के बाद .cer फ़ाइलों का उपयोग करते समय मामले।

केवल सुरक्षित तरह से सुनिश्चित करने के लिए निजी कुंजी उपलब्ध है एक PKCS # 12 फ़ाइल जहां दोनों प्रमाण पत्र (रों) और निजी कुंजी उपलब्ध हैं से प्रमाण पत्र (यानी दोनों में निर्यात किया गया लोड करने के लिए है। पीएफएक्स फ़ाइल)।

नोट्स:

  • मैंने कहा आम तौर पर क्योंकि Windows/CryptoAPI कभी कभी करता है कुछ जादू (जब X509Certificate के साथ इस्तेमाल किया) और स्वचालित रूप से certificate.key स्टोर से एक निजी कुंजी के साथ एक प्रमाण पत्र से संबद्ध।

  • मैंने कहा सुरक्षित क्योंकि यह मोनो पर भी काम करेगा, न केवल एमएस .NET।

+0

यह मेरे सिर पर है। मुझे पीकेसीएस # 12 फाइल कहां मिलती/मिलती है? और मैं इससे निजी कुंजी कैसे लोड करूं? –

+1

पहले सुनिश्चित करें कि आप * चाहते हैं * क्लाइंट प्रमाणपत्र :-) आपका स्रोत कोड इस सुविधा का उपयोग कर (गलत) है लेकिन यह स्पष्ट नहीं है कि आप यही चाहते हैं। यदि आप केवल सर्वर से "https" चाहते हैं तो आपको अपने क्लाइंट एप्लिकेशन से प्रमाणपत्र संभाल करने की आवश्यकता नहीं है। – poupou

+0

मैं अपने WebClient.UploadValues ​​कॉल डेटा को सुरक्षित करना चाहता हूं। सब कुछ मैं वास्तव में जानता हूं कि कैसे व्यक्त करना है। तो मैं आपसे पूछता हूं: क्या मैं _need_client प्रमाण पत्र करता हूं? –

0

बस आरडीपी

IE खोलें के साथ अपने सर्वर से कनेक्ट और इंटरनेट विकल्प

नेविगेट उन्नत टैब पर करने के लिए जाने के लिए और SSL का उपयोग दोनों 2.0 और SSL 3.0 का

अब आप अपने सर्वर अनुरोध प्रमाणीकृत किया जाएगा सक्षम करें

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