2010-01-14 16 views
61

मुझे पता है कि एक HttpWebRequest को प्रमाणपत्र जोड़ने के लिए यह बहुत आसान है। हालांकि, मुझे वेब क्लाइंट का उपयोग करके समकक्ष करने का कोई तरीका नहीं मिला है। मूल रूप से, मैं वेब क्लाइंट का उपयोग कर एक विशिष्ट प्रमाणपत्र के साथ एक पोस्ट भेजना चाहता हूं।आप वेब क्लाइंट (सी #) में प्रमाणपत्र कैसे जोड़ सकते हैं?

आप WebClient का उपयोग कर इस सटीक कोड कैसे पूरा होगा:

var request = (HttpWebRequest) WebRequest.Create("my-url"); 
    request.Method = "POST"; 
    request.ClientCertificates.Add(new X509Certificate()); //add cert 

उत्तर

72

आप उपवर्ग और एक या अधिक कार्यों को ओवरराइड करना होगा।

class MyWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); 
     request.ClientCertificates.Add(new X509Certificate()); 
     return request; 
    } 
} 
+0

धन्यवाद, यह बहुत अच्छा काम किया। – Andrew

+0

बहुत बढ़िया! – RandomInsano

4

बस उपवर्ग WebClient, अपने खुद के ClientCertificates संपत्ति जोड़ सकते हैं और WebClient.GetWebRequest(System.Uri) विधि ओवरराइड। मैं समय VB से सी # में बदलने के लिए नहीं है, लेकिन यह काफी आत्म व्याख्यात्मक होना चाहिए:

Imports System.Net 

Public Class WebClient2 
    Inherits System.Net.WebClient 

    Private _ClientCertificates As New System.Security.Cryptography.X509Certificates.X509CertificateCollection 
    Public ReadOnly Property ClientCertificates() As System.Security.Cryptography.X509Certificates.X509CertificateCollection 
     Get 
      Return Me._ClientCertificates 
     End Get 
    End Property 
    Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest 
     Dim R = MyBase.GetWebRequest(address) 
     If TypeOf R Is HttpWebRequest Then 
      Dim WR = DirectCast(R, HttpWebRequest) 
      If Me._ClientCertificates IsNot Nothing AndAlso Me._ClientCertificates.Count > 0 Then 
       WR.ClientCertificates.AddRange(Me._ClientCertificates) 
      End If 
     End If 
     Return R 
    End Function 
End Class 
4

एक दिलचस्प बात तब हुई जब हमारे सामने के अंत में एक नया प्रमाणपत्र स्थापित किया गया। हमने त्रुटि प्राप्त करना शुरू कर दिया:

"अंतर्निहित कनेक्शन बंद था: एसएसएल/टीएलएस सुरक्षित चैनल के लिए ट्रस्ट रिलेशनशिप स्थापित नहीं कर सका। अंतर्निहित कनेक्शन बंद था: एसएसएल/टीएलएस सुरक्षित चैनल के लिए ट्रस्ट रिलेशनशिप स्थापित नहीं कर सका। , "

हमने प्रत्येक फ्रंट-एंड पर जाकर और ब्राउज़र खोलकर त्रुटि का ख्याल रखा। ऐसा लगता है कि आईई पुराने प्रमाणपत्र को कैश कर रहा था। ब्राउज़र खोलकर, नया प्रमाणपत्र प्रभावी हुआ। समस्या सुलझ गयी!

9
public class CertificateWebClient : WebClient 
{ 
    private readonly X509Certificate2 certificate; 

    public CertificateWebClient(X509Certificate2 cert) 
    { 
     certificate = cert; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); 

     System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate X509certificate, X509Chain chain, System.Net.Security.SslPolicyErrors errors) 
     { 
      return true; 
     }; 

     request.ClientCertificates.Add(certificate); 
     return request; 
    } 
} 

अब आप स्वयं हस्ताक्षरित प्रमाणपत्र के साथ कर सकते हैं! ("अंतर्निहित कनेक्शन बंद कर दिया गया था: SSL/TLS सुरक्षित चैनल के लिए विश्वास संबंध स्थापित नहीं किया जा सका .; अंतर्निहित कनेक्शन बंद कर दिया गया था: SSL के लिए विश्वास संबंध स्थापित नहीं किया जा सका/TLS सुरक्षित चैनल .;")

 X509Certificate2 Cert = new X509Certificate2("client.p12", "1234", X509KeyStorageFlags.MachineKeySet); 

     // Create a new WebClient instance. 
     CertificateWebClient myWebClient = new CertificateWebClient(Cert); 

     string fileName = Installation.destXML; 
     string uriString = "https://xxxxxxx.xx:918"; 
     // Upload the file to the URI. 
     // The 'UploadFile(uriString,fileName)' method implicitly uses HTTP POST method. 
     byte[] responseArray = myWebClient.UploadFile(uriString, fileName); 

     // Decode and display the response. 
     Console.WriteLine("\nResponse Received.The contents of the file uploaded are:\n{0}", 
      System.Text.Encoding.ASCII.GetString(responseArray)); 
+2

के लिए यह कैसे करना है, यह जानने का प्रयास कर रहे हैं कि यदि आप webRequest.ClientCertificates में प्रमाणपत्र जोड़ते हैं तो आपको अब सर्वर प्रमाणपत्र प्रमाणन कॉलबैक को ओवरराइड करने की आवश्यकता नहीं है, जो एक वैश्विक सेटिंग है, और इस प्रकार आप –

+0

सब कुछ प्रभावित कर रहे हैं इस अपवाद संदेश को 'अंतर्निहित कनेक्शन बंद कर दिया गया था: एसएसएल/टीएलएस सुरक्षित चैनल के लिए ट्रस्ट रिलेशनशिप स्थापित नहीं कर सका' इस 'सर्विसपॉइंट मैनेजर। सुरक्षा प्रोट्रोकॉल = सुरक्षाप्रोटोकॉल टाइप प्रकार। SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; ' – Fourat

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