如何向 WebClient (C #)添加证书?

我知道向 HttpWebRequest 添加证书非常简单。但是,我还没有找到使用 WebClient 实现等效的方法。基本上,我想使用 WebClient 发送带有特定证书的 POST。

如何使用 WebClient 完成这些代码:

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

只是子类 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

您必须继承并重写一个或多个函数。

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

当我们的前端安装了一个新的证书时,一件有趣的事情发生了,我们开始得到错误:

”基础连接已关闭: 无法为 SSL/TLS 安全通道建立信任关系; 基础连接已关闭: 无法为 SSL/TLS 安全通道建立信任关系;

我们通过访问每个前端并打开浏览器来处理这个错误。IE 似乎在缓存旧证书。通过打开浏览器,新证书生效。问题解决了!

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