HTTPS Datei Upload mit POST

Eine nette Auf­gabe kam heute auf mich zu … aus einem Pro­gramm her­aus eine Datei über eine Web­site per HTML-Formular auf einen Web­server laden, das ganze über eine HTTPS-Verbindung und mit Authen­tifizierung per Zertifikat.

Klingt eigentlich nicht so schwer … dachte ich zumindest.

Die Zer­ti­fikate aus dem Cer­tifi­cate­Store von Win­dows ausle­sen war auch rel­a­tiv ein­fach, der Upload per HTTP eigentlich auch … bis ich dann das Zielfor­mu­lar über die Zer­ti­fikatabfrage schützte.

Die Suche nach der Fehlerquelle hat dann einige Zeit gekostet, bis ich dann irgend­wann fest­stellte dass Apache es ein­fach nicht mag wenn man über eine SSL-Verbindung ohne Vorankündi­gung ein POST-Formular abschickt.

Die Lösung des Prob­lems war dann rel­a­tiv ein­fach, ein­fach vorher einen kurzen Seit­enabruf mit GET, dann den tat­säch­lichen Upload, zwis­chen­durch die Ses­sion nicht ver­lieren und voila…

X509CertificateCollection certs = new X509CertificateCollection();
MyC­erts myc­ert = new MyC­erts();
int num = mycert.Init();
for (int i=0; i < num; i++)
certs.Add(mycert[i]);

Http­We­bRe­quest webre­quest = (HttpWebRequest)WebRequest.Create(uri);
webrequest.ClientCertificates = certs;
webrequest.Method = “GET“
WebRe­sponse response = webrequest.GetResponse();
Stream read = response.GetResponseStream();
read.Close();

webre­quest = (HttpWebRequest)WebRequest.Create(uri);
webrequest.ClientCertificates = certs;
webrequest.Method = “POST“
webrequest.ContentType = “multipart/form-data; bound­ary=” + bound­ary;
// con­tent zusam­men­bauen und senden

auf ein­mal geht es einwandfrei.

2 Gedanken zu “HTTPS Datei Upload mit POST

  1. Hallo Ger­ald,

    genau so etwas suche ich auch und ich bin lei­der kein .NET-Experte. Kannst Du mir vielle­icht ein­mal das voll­ständige Bespiel zumailen? Das mit dem ‘con­tent zusam­men­bauen’ auf der .NET-Seite und die Sache mit der ‘Ses­sion nicht ver­lieren’ auf der Apache-Seite inter­essieren mich besonders.

  2. Wow, ich bin beein­druckt … ich hätte nicht gedacht dass eine Seite die eigentlich nur zum web­site entwick­eln gedacht ist so schnell bei google auftaucht.

    Aber zur eigentlichen Fragem, eigentlich ist das schon fast der kom­plette Code.
    MyC­erts ist eine Klasse von mir zum spe­ich­ern der Zer­ti­fikate, ich habe sie aus diesem Beitrag her­aus entwick­elt:
    http://support.microsoft.com/?scid=kb%3Ben-us%3B895971&x=16&y=11

    Zum Senden noch:

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

    Lei­der kann ich nicht den kom­plet­ten Code her­aus­geben da ich das Pro­gramm für den Ein­satz inner­halb der Fraun­hofer Gesellschaft entwick­elt habe.

Hinterlasse eine Antwort

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

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">