HTTPS Datei Upload mit POST

Eine nette Aufgabe kam heute auf mich zu … aus einem Programm heraus eine Datei über eine Website per HTML-Formular auf einen Webserver laden, das ganze über eine HTTPS-Verbindung und mit Authentifizierung per Zertifikat.

Klingt eigentlich nicht so schwer … dachte ich zumindest.

Die Zertifikate aus dem CertificateStore von Windows auslesen war auch relativ einfach, der Upload per HTTP eigentlich auch … bis ich dann das Zielformular über die Zertifikatabfrage schützte.

Die Suche nach der Fehlerquelle hat dann einige Zeit gekostet, bis ich dann irgendwann feststellte dass Apache es einfach nicht mag wenn man über eine SSL-Verbindung ohne Vorankündigung ein POST-Formular abschickt.

Die Lösung des Problems war dann relativ einfach, einfach vorher einen kurzen Seitenabruf mit GET, dann den tatsächlichen Upload, zwischendurch die Session nicht verlieren und voila…

X509CertificateCollection certs = new X509CertificateCollection();
MyCerts mycert = new MyCerts();
int num = mycert.Init();
for (int i=0; i < num; i++)
certs.Add(mycert[i]);

HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
webrequest.ClientCertificates = certs;
webrequest.Method = "GET"
WebResponse response = webrequest.GetResponse();
Stream read = response.GetResponseStream();
read.Close();

webrequest = (HttpWebRequest)WebRequest.Create(uri);
webrequest.ClientCertificates = certs;
webrequest.Method = "POST"
webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
// content zusammenbauen und senden

auf einmal geht es einwandfrei.

Veröffentlicht von

Gerald

Diplom-Informatiker (DH) in Darmstadt. Ich blogge über Entwicklung, Internet, mobile Geräte und Virtualisierung. Meine Beiträge gibt es auch bei Google+ und Facebook.

2 Gedanken zu „HTTPS Datei Upload mit POST“

  1. Hallo Gerald,

    genau so etwas suche ich auch und ich bin leider kein .NET-Experte. Kannst Du mir vielleicht einmal das vollständige Bespiel zumailen? Das mit dem ‚content zusammenbauen‘ auf der .NET-Seite und die Sache mit der ‚Session nicht verlieren‘ auf der Apache-Seite interessieren mich besonders.

  2. Wow, ich bin beeindruckt … ich hätte nicht gedacht dass eine Seite die eigentlich nur zum website entwickeln gedacht ist so schnell bei google auftaucht.

    Aber zur eigentlichen Fragem, eigentlich ist das schon fast der komplette Code.
    MyCerts ist eine Klasse von mir zum speichern der Zertifikate, ich habe sie aus diesem Beitrag heraus entwickelt:
    http://support.microsoft.com/?scid=kb%3Ben-us%3B895971&x=16&y=11

    Zum Senden noch:

    Stream requestStream = webrequest.GetRequestStream();
    requestStream.Write(…);
    WebResponse responce = webrequest.GetResponse();
    // und die antwort lesen
    Stream s = responce.GetResponseStream();
    StreamReader sr = new StreamReader(s);
    return sr.ReadToEnd();

    Leider kann ich nicht den kompletten Code herausgeben da ich das Programm für den Einsatz innerhalb der Fraunhofer Gesellschaft entwickelt habe.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.