Ich weiß, dass es ziemlich einfach ist, einem HttpWebRequest ein Zertifikat hinzuzufügen. Ich habe jedoch keine Möglichkeit gefunden, das Äquivalent mit WebClient zu erreichen. Grundsätzlich möchte ich mit WebClient einen POST mit einem bestimmten Zertifikat versenden.
Wie würden Sie genau diesen Code mit WebClient erreichen:
var request = (HttpWebRequest) WebRequest.Create("my-url");
request.Method = "POST";
request.ClientCertificates.Add(new X509Certificate()); //add cert
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; } }
Jetzt können Sie mit selbst signiertem Zertifikat! ("Die zugrunde liegende Verbindung wurde geschlossen: Es konnte keine Vertrauensbeziehung für den sicheren SSL / TLS-Kanal hergestellt werden. Die zugrunde liegende Verbindung wurde geschlossen: Es konnte keine Vertrauensbeziehung für den sicheren SSL / TLS-Kanal hergestellt werden.")
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));
quelle
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel
fügen Sie diese hinzuServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
Eine interessante Sache passierte, als ein neues Zertifikat auf unseren Frontends installiert wurde. Wir haben den Fehler bekommen:
"Die zugrunde liegende Verbindung wurde geschlossen: Es konnte keine Vertrauensbeziehung für den sicheren SSL / TLS-Kanal hergestellt werden. Die zugrunde liegende Verbindung wurde geschlossen: Es konnte keine Vertrauensbeziehung für den sicheren SSL / TLS-Kanal hergestellt werden."
Wir haben uns um den Fehler gekümmert, indem wir zu jedem Frontend gegangen sind und den Browser geöffnet haben. Es scheint, dass der IE das alte Zertifikat zwischengespeichert hat. Durch das Öffnen der Browser wurde das neue Zertifikat wirksam. Problem gelöst!
quelle
Einfach Unterklasse
WebClient
, eigeneClientCertificates
Eigenschaft hinzufügen undWebClient.GetWebRequest(System.Uri)
Methode überschreiben . Ich habe keine Zeit, dies von VB in C # umzuwandeln, aber es sollte ziemlich selbsterklärend sein: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
quelle