{"version":"1.0","provider_name":"Gerald Schneider","provider_url":"https:\/\/schneidr.de","author_name":"Gerald Schneider","author_url":"https:\/\/schneidr.de\/author\/gerald\/","title":"HTTPS Datei Upload mit POST","html":"Eine nette Aufgabe kam heute auf mich zu ... aus einem Programm heraus eine Datei \u00fcber eine Website per HTML-Formular auf einen Webserver laden, das ganze \u00fcber eine HTTPS-Verbindung und mit Authentifizierung per Zertifikat.\r\n\r\nKlingt eigentlich nicht so schwer ... dachte ich zumindest.\r\n\r\nDie Zertifikate aus dem CertificateStore von Windows auslesen war auch relativ einfach, der Upload per HTTP eigentlich auch ... bis ich dann das Zielformular \u00fcber die Zertifikatabfrage sch\u00fctzte.\r\n\r\nDie Suche nach der Fehlerquelle hat dann einige Zeit gekostet, bis ich dann irgendwann feststellte dass Apache es einfach nicht mag wenn man \u00fcber eine SSL-Verbindung ohne Vorank\u00fcndigung ein POST-Formular abschickt.\r\n\r\nDie L\u00f6sung des Problems war dann relativ einfach, einfach vorher einen kurzen Seitenabruf mit GET, dann den tats\u00e4chlichen Upload, zwischendurch die Session nicht verlieren und voila...\r\n<pre lang=\"csharp\">X509CertificateCollection certs = new X509CertificateCollection();\r\nMyCerts mycert = new MyCerts();\r\nint num = mycert.Init();\r\nfor (int i=0; i &lt; num; i++)\r\ncerts.Add(mycert[i]);\r\n\r\nHttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);\r\nwebrequest.ClientCertificates = certs;\r\nwebrequest.Method = \"GET\"\r\nWebResponse response = webrequest.GetResponse();\r\nStream read = response.GetResponseStream();\r\nread.Close();\r\n\r\nwebrequest = (HttpWebRequest)WebRequest.Create(uri);\r\nwebrequest.ClientCertificates = certs;\r\nwebrequest.Method = \"POST\"\r\nwebrequest.ContentType = \"multipart\/form-data; boundary=\" + boundary;\r\n\/\/ content zusammenbauen und senden<\/pre>\r\nauf einmal geht es einwandfrei.","type":"rich"}