代码之家  ›  专栏  ›  技术社区  ›  Andrew

如何向WebClient(c)添加证书?

  •  68
  • Andrew  · 技术社区  · 16 年前

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

    您将如何使用WebClient来完成这个精确的代码:

        var request = (HttpWebRequest) WebRequest.Create("my-url");
        request.Method = "POST";
        request.ClientCertificates.Add(new X509Certificate()); //add cert
    
    4 回复  |  直到 13 年前
        1
  •  83
  •   Mikael Svenson    16 年前

    您必须子类化并重写一个或多个函数。

    class MyWebClient : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
            request.ClientCertificates.Add(new X509Certificate());
            return request;
        }
    }
    
        2
  •  10
  •   yop038    13 年前
    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));
    
        3
  •  4
  •   Chris Haas    16 年前

    只是子类 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
    
        4
  •  4
  •   Jose    14 年前

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

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

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