GeckoFX SSL Handshake x509 Client Certifcation in VB.NET

  • VB.NET
  • .NET (FX) 3.0–3.5

    GeckoFX SSL Handshake x509 Client Certifcation in VB.NET

    Erstmal ein Hallo an euch und ich hoffe ihr könnt mir mit eurem Fachwissen weiterhelfen,

    Wir bauen derzeit eine Anwendung die mittels GeckoFX und Navigate Inhalte darstellt. Dies ist auch soweit gut. Im Zuge der Weiterentwicklung, auch im Bezug auf die Sicherheit, wollen wir eine Client Certificate Authentification einbauen. Direkt im FireFox geht das einwandfrei. Somit der Grundtest erledigt. Im zweiten Schritt habe ich zum testen eine eigene kleine Funktion geschrieben die den Request / Response Stream simuliert, der wie folgt aussieht:

    VB.NET-Quellcode

    1. Private Function ClientAuthenification()
    2. Dim PrivateKeyPath As String = Directory.GetCurrentDirectory & "\file.p12"
    3. Dim CertificatePassword As String = "password"
    4. Dim Certificate As New X509Certificate2(PrivateKeyPath, CertificatePassword)
    5. Dim PostData As String = "val1=1&val2=2&val3=3&val4=4..."
    6. Dim ByteArr() As Byte = Encoding.UTF8.GetBytes(PostData)
    7. Dim HTTPReq As HttpWebRequest = WebRequest.Create("https://myserver/")
    8. HTTPReq.ClientCertificates.Add(Certificate)
    9. HTTPReq.UserAgent = "useragent"
    10. HTTPReq.Method = "POST"
    11. HTTPReq.ContentType = "application/x-www-form-urlencoded"
    12. HTTPReq.ContentLength = ByteArr.Length
    13. Dim DataStream As Stream = HTTPReq.GetRequestStream()
    14. DataStream.Write(ByteArr, 0, ByteArr.Length)
    15. DataStream.Close()
    16. Dim HTTPResp As HttpWebResponse = HTTPReq.GetResponse()
    17. DataStream = HTTPResp.GetResponseStream()
    18. Dim SReader As StreamReader = New StreamReader(DataStream)
    19. Dim ServerResponse As String = SReader.ReadToEnd()
    20. SReader.Close()
    21. DataStream.Close()
    22. HTTPResp.Close()
    23. Return ServerResponse
    24. End Function


    Auch das geht einwandfrei, der Server akzeptiert die Anbindung und liefert das Ergebnis, sprich den HTML Inhalt. Also genereller Test erfolgreich. :D

    Als letzten Schritt wollte ich das nun in der Gecko Engine umsetzen und hänge seit gestern in den Seilen :D Mein genereller Ansatz ist wie folgt:

    VB.NET-Quellcode

    1. Private Sub ClientAuthenificationGecko()
    2. Dim PrivateKeyPath As String = Directory.GetCurrentDirectory & "\file.p12"
    3. Dim CertificatePassword As String = "password"
    4. Dim Certificate As New X509Certificate2(PrivateKeyPath, CertificatePassword)
    5. Dim GeckoCert As Gecko.Certificates.Certificate = Gecko.Certificates.CertificateDatabase.ConstructX509FromBase64(Convert.ToBase64String(Certificate.Export(X509ContentType.Cert)))
    6. Dim PostStream As Gecko.IO.MimeInputStream = Gecko.IO.MimeInputStream.Create()
    7. Dim HeaderStream As Gecko.IO.MimeInputStream = Gecko.IO.MimeInputStream.Create()
    8. Dim PostData As String = "val1=1&val2=2&val3=3&val4=4..."
    9. PostStream.SetData(PostData)
    10. PostStream.AddHeader("Content-Type", "application/x-www-form-urlencoded")
    11. PostStream.AddContentLength = True
    12. HeaderStream.AddHeader("User-Agent", "useragent")
    13. GeckoWebBrowser1.Navigate("https://myserver/", Gecko.GeckoLoadFlags.None, "", PostStream, HeaderStream)
    14. End Sub


    Im Prinzip müsste ich doch nur dem HeaderStream einen neuen AddHeader("SSL XXX", Zertifikatsdaten) übergeben, jeglicher Versuch überhaupt eine andere Meldung zu erhalten als die Folgende scheiterte bis dato:

    Cannot communicate securely with peer: no common encryption algorithm(s).
    (Error code: ssl_error_no_cypher_overlap)


    Die Meldung macht ja Sinn, denn er hat ja keinen Algorhythmus erhalten :D Jetzt hoffe ich auf einen wertvollen Tip von euch, wie ich den Gecko dazu bekomme dieses "Insekt" zu fangen und umzusetzen.
    Ich danke euch schonmal im Vorraus und bin für jegliche Anregungen dankbar.

    MFG
    Ben