如何将证书添加到WebClient(C#)?
我知道向HttpWebRequest添加证书非常简单。 但是,我还没有find一种方法来使用WebClient做等效。 基本上,我想用WebClient发送一个具有特定证书的POST。
你将如何使用WebClient完成这个确切的代码:
var request = (HttpWebRequest) WebRequest.Create("my-url"); request.Method = "POST"; request.ClientCertificates.Add(new X509Certificate()); //add cert
您必须inheritance并覆盖一个或多个函数。
class MyWebClient : WebClient { protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); request.ClientCertificates.Add(new X509Certificate()); return request; } }
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; } }
现在你可以用自签名的证书! (“底层连接已closures:无法build立SSL / TLS安全通道的信任关系;底层连接已closures:无法build立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));
只需子类WebClient
,添加您自己的ClientCertificates
属性并重写WebClient.GetWebRequest(System.Uri)
方法。 我没有时间从VB转换成C#,但它应该是不言而喻的:
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
在我们的前端安装新证书时,发生了一件有趣的事情。 我们开始得到错误:
“底层连接已closures:无法为SSL / TLS安全通道build立信任关系;底层连接已closures:无法build立SSL / TLS安全通道的信任关系;”
我们通过前往每个前端并打开浏览器来照顾错误。 看来,IEcaching旧证书。 通过打开浏览器,新证书生效。 问题解决了!