2010-01-14 17 views
61

HttpWebRequest ürününe sertifika eklemek oldukça kolay. Ancak, WebClient kullanarak eşdeğer bir yol bulmak için bir yol bulamadım. Temel olarak, WebClient kullanarak belirli bir sertifikaya sahip bir POST göndermek istiyorum. Eğer WebClient'ı kullanarak bu tam kodunu başarmak istiyorum nasılWebClient'e (C#) bir Sertifika nasıl ekleyebilirim?

:

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

cevap

72

Sen alt sınıfı ve bir veya daha fazla işlevleri geçersiz kılmak gerekir.

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

Teşekkürler, bu harika çalıştı. – Andrew

+0

Harika! Bunu çok uzun bir süre için nasıl yapacağınızı anlamaya çalışıyorum – RandomInsano

4

Hemen alt sınıf WebClient kendi ClientCertificates özellik eklemek ve WebClient.GetWebRequest(System.Uri) yöntemini geçersiz. Ben VB C# için bu dönüştürmek için zamanımız yok ama oldukça kendini açıklayıcı olmalıdır:

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

Ön uçlarımızda yeni bir sertifika yüklendiğinde ilginç bir şey oldu. Hata:

"Temel bağlantı kapatıldı: SSL/TLS güvenli kanalı için güven ilişkisi kurulamadı. Temel bağlantı kapatıldı: SSL/TLS güvenli kanalı için güven ilişkisi kurulamadı. ;"

Her ön uça gidip tarayıcıyı açarak hatayı aldık. Görünüşe göre IE eski sertifikayı önbelleğe alıyordu. Tarayıcıları açarak yeni sertifika yürürlüğe girdi. Sorun çözüldü!

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; 
    } 
} 

Şimdi kendiniz imzalı sertifika ile yapabilirsiniz! ("Temel alınan bağlantı kapatıldı:/TLS güvenli kanal .; SSL için güven ilişkisi kurulamadı: Temel alınan bağlantı kapatıldı .; SSL/TLS güvenli kanal için güven ilişkisi kurulamadı")

 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

Sertifikayı webRequest.ClientCertificates'a eklerseniz, artık global bir ayar olan ServerCertificateValidationCallback'i geçersiz kılmanız gerekmeyecek ve bu nedenle, –

+0

herşeyi etkiliyorsunuz demektir. Bu yürütme mesajına sahip ol 'Altta yatan bağlantı kapatıldı: SSL/TLS güvenli kanal için güven ilişkisi kurulamadı' bu ürünü ekleyin ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; ' – Fourat

İlgili konular