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.