none
Certificat et httprequest RRS feed

  • Question

  • Bonjour,

    Je dois envoyer des données par méthode post vers une adresse ssl ( https ), je possède le certificat en .cer. Voila le code utilisé :

    dim postData As String
                postData = "données"
                Dim request As system.Net.HttpWebRequest
                request = CType(system.Net.WebRequest.Create("https://host/"), system.Net.HttpWebRequest)
                request.ContentType = "application/x-www-form-urlencoded"
                request.UserAgent="appli"
                request.ContentLength = postData.Length
                request.Method = "POST"
                request.KeepAlive=False
                Dim requestStream As system.IO.Stream = request.GetRequestStream()
                Dim postBytes As Byte() = system.Text.Encoding.ASCII.GetBytes(postData)
                requestStream.Write(postBytes, 0, postBytes.Length)
                requestStream.Close()

    Je voudrais donc ajouter le certificat avec request.ClientCertificates.add(certificat) mais je ne sais pas comment m'y prendre avec le Compact Framework car la ligne suivante :
    System.Security.Cryptography.X509Certificates.X509Certificate ClientCertificate = new System.Security.Cryptography.X509Certificates.X509Certificate("C:\certificate.cer")
    ne fonctionne pas avec le CF.

    Merci de votre aide
    mercredi 17 mars 2010 18:45

Toutes les réponses

  • Pour implémenter une politique de sécurité, il faut créer une classe qui implémente ICertificatePolicy

    Imports System.Net
    Imports System.Security.Cryptography.X509Certificates
    
    Public Class TrustAllCertificatePolicy
    
        Implements ICertificatePolicy
    
        ' Default policy for certificate validation.
        Public Shared DefaultValidate As Boolean = True
    
        Public Function CheckValidationResult(ByVal srvPoint As ServicePoint, _
           ByVal cert As X509Certificate, ByVal request As WebRequest, ByVal problem As Integer) _
           As Boolean Implements ICertificatePolicy.CheckValidationResult
    
            Return DefaultValidate
        End Function
    
    End Class
    
    Puis avant de faire le moindre échange, il faut mettre en place cette politique (une seule fois pour tout le programme)

    REM On met en place la politique de sécurité
    
    System.Net.ServicePointManager.CertificatePolicy = New TrustAllCertificatePolicy()
    
    vendredi 19 mars 2010 10:26
  • Merci mais que signifie " On met en place la politique de sécurité" et comment faire pour la mettre en place ? Mon certificat est de la forme

    -----BEGIN CERTIFICATE-----

    ...fh65g7j5gh4k,86k7m5o456y4iu...

    -----END CERTIFICATE-----

    J'utilise ce code mais il ne fonctionne pas :

     

         dim a as string="...fh65g7j5gh4k,86k7m5o456y4iu..."
            
               Dim certBytes(System.Text.Encoding.ASCII.GetByteCount(a)) As Byte
            certBytes = System.Text.Encoding.ASCII.GetBytes(a)
     
            Dim certChars(certBytes.Length - 1) As Char
            For byteCounter as Integer = 0 To certBytes.Length - 1
                certChars(byteCounter) = microsoft.VisualBasic.ChrW(certBytes(byteCounter))
            Next
     
            Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder(New String(certChars))
            certBytes = System.Convert.FromBase64String(sb.ToString)
     
            Dim cert As New Security.Cryptography.X509Certificates.X509Certificate(certBytes)

     request.ClientCertificates.add(cert)

     

    Voila le message d'erreur :

     


    Cryptographic Exception

    ?chec de la cr?ation de l’objet certificate. Soit les donn?es pass?es sont incorrectes, soit elles ne sont pas prises en charge par le .NET Compact Framework. Le .NET Compact Framework ne prend pas en charge la lecture de fichier pfx.

    System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData)

    System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] data)

    MainForm.Timer1Tick(Object sender, EventArgs e)

    System.Windows.Forms.Timer._WnProc(WM wm, Int32 wParam, Int32 lParam)

    System.Windows.Forms.ApplicationThreadContext._InternalContextMessages(WM wm, Int32 wParam, Int32 lParam)

    Microsoft.AGL.Forms.EVL.enterMainLoop(IntPtr hwnMain)

    System.Windows.Forms.Application.Run(Form fm)

    MainForm.Main()

     

     

    merci


    vendredi 19 mars 2010 12:10