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.
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.
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:
Leider kann ich nicht den kompletten Code herausgeben da ich das Programm für den Einsatz innerhalb der Fraunhofer Gesellschaft entwickelt habe.