Question

Je sais qu'il est assez simple d'ajouter un certificat à un HttpWebRequest. Cependant, je ne l'ai pas trouvé un moyen de faire l'équivalent en utilisant WebClient. Basiquement, je veux envoyer un POST avec un certificat spécifique à l'aide WebClient.

Comment voulez-vous accomplir ce code exact en utilisant WebClient:

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

La solution

Vous devez sous-classe et remplacer une ou plusieurs fonctions.

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

Autres conseils

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

Maintenant, vous pouvez l'auto signé cert! ( « La connexion sous-jacente a été fermée: Impossible d'établir une relation de confiance pour le canal sécurisé SSL / TLS .; La connexion sous-jacente a été fermée:. N'a pas pu établir une relation de confiance pour le canal sécurisé 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));

Juste sous-classe WebClient, ajoutez votre propre propriété ClientCertificates et remplacer la méthode de WebClient.GetWebRequest(System.Uri). Je n'ai pas le temps de convertir en C # à partir de VB, mais il devrait être assez explicite:

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

Une chose intéressante est arrivé quand un nouveau certificat a été installé sur nos serveurs frontaux. Nous avons commencé à obtenir l'erreur:

« La connexion sous-jacente a été fermée: Impossible d'établir une relation de confiance pour le canal sécurisé SSL / TLS .; La connexion sous-jacente a été fermée:. N'a pas pu établir une relation de confiance pour le canal sécurisé SSL / TLS; »

Nous avons pris soin de l'erreur en allant à chaque fin avant et l'ouverture du navigateur. Il semble que IE a été mise en cache l'ancien certificat. En ouvrant les navigateurs, le nouveau certificat est entré en vigueur. Problème résolu!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top