मैं https का उपयोग करके SSL एन्क्रिप्टेड साइट तक पहुंचने के लिए WebRequest का उपयोग कैसे करूं?


116

मैं एक प्रोग्राम लिख रहा हूं जो किसी उपयोगकर्ता द्वारा प्रदान किए गए URL से सामग्री पढ़ता है। मेरी समस्या उस कोड में है जो कुछ इस प्रकार है:

Uri uri = new Uri(url);
WebRequest webRequest = WebRequest.Create(uri);
WebResponse webResponse = webRequest.GetResponse();
ReadFrom(webResponse.GetResponseStream());

और यह तब होता है जब प्रदान किया गया यूआरएल एक "https: //" URL होता है। क्या कोई मुझे इस कोड को बदलने में मदद कर सकता है ताकि यह SSL एन्क्रिप्टेड सामग्री के साथ काम करे। धन्यवाद।

जवाबों:


175

आप इसे सही तरीके से कर रहे हैं, लेकिन उपयोगकर्ता उन साइटों को url प्रदान कर सकते हैं, जिनके पास अवैध SSL कट लगाए गए हैं। यदि आप वास्तविक वेब अनुरोध करने से पहले इस पंक्ति को रखते हैं तो आप उन प्रमाणित समस्याओं को अनदेखा कर सकते हैं:

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

जहां AcceptAllCertificationsके रूप में परिभाषित किया गया है

public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
}

41
इस उत्तर के लिए धन्यवाद! कुछ बेकार कोड से बचने के लिए मैंने इसे इस तरह इस्तेमाल किया: ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;
चार्ल्स ओउलेट

4
धन्यवाद, आपने मेरी मदद की सर। F # इसे इतना आसान बनाता है:ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true)
डेविड ग्रेनियर

2
@Charles Ouellet मुझे लगता है कि मैं आपसे भी ज्यादा आलसी हूं, (a, b, c, d) => सच
Despertar

24
मैं पसंद करता हूं+= delegate { return true; }
vkrzv

2
इस दृष्टिकोण से जुड़े संभावित जोखिमों से अवगत रहें। अधिक जानकारी के लिए stackoverflow.com/a/6613434/2969615 देखें ।
जो कोयल

19

यह लिंक आपके लिए हितकारी होगा : http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

Http कनेक्शन के लिए, WebRequest और WebResponse वर्ग SSL का उपयोग करने वाले वेब होस्ट के साथ संवाद करने के लिए SSL का उपयोग करते हैं। SSL का उपयोग करने का निर्णय WebRequest वर्ग द्वारा किया जाता है, यह URI के आधार पर दिया गया है। यदि यूआरआई "https:" से शुरू होता है, तो एसएसएल का उपयोग किया जाता है; यदि URI "http:" से शुरू होता है, तो एक अनएन्क्रिप्टेड कनेक्शन का उपयोग किया जाता है।


बढ़िया लिंक। यह एक महत्वपूर्ण अंतर है।
DanM7

1
आपके उत्तर का अर्थ है कि प्रश्न में कोड काम करना चाहिए?
रोलैंड शॉ

18

यह एक मेरे लिए काम किया:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

1
डिफ़ॉल्ट मान "Ssl2 | Tls" है। मैंने केवल अपने सर्वर पर Tls 1.1 और 1.2 को सक्षम किया था। यह वास्तव में समस्या तय हो गई! Linux पर nginX के साथ LetsEncrypt के लिए, प्रोटोकॉल यहां परिभाषित किए गए हैं: /etc/letsencrypt/options-ssl-nginx.conf
जेरथ

मेरा मानना ​​है कि यह एक अलग मुद्दे से निपट रहा है। यह अमान्य सेर्ट्स के बारे में नहीं बल्कि उच्चतर टीएलएस संस्करण है।
wp78de

मुझे "एक मौजूदा कनेक्शन दूरस्थ होस्ट द्वारा जबरन बंद कर दिया गया था" और इस समाधान ने मेरे लिए काम किया
oamilkar

ध्यान दें कि यह एक वैश्विक कॉन्फ़िगरेशन है, इसलिए आपको केवल एक बार ऐसा करना होगा और प्रत्येक बार जब आप अनुरोध सेट नहीं करेंगे।
चाड हेडगॉक

क्या मैं किसी एक अनुरोध के लिए ऐसा कर सकता हूं? ऐसा लगता है कि ServicePointManager एक वैश्विक चीज़ है ...
wexman
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.