Download einer Datei mittels WinHttp.WinHttpRequest.5.1 mit AutoIt über https-Verbindung
// November 12th, 2011 // 5 Comments » // IT, Tutorials
Vor kurzem stand ich vor dem Problem, dass ich zu einer https Seite (also einer Webseite mit SSL Verschlüsselung) ohne vertrauenswürdigem Zertifkat mittels AutoIt verbinden musste, um eine Datei herunterzuladen. Um Zugriff auf die Seite zu bekommen, ist eine Authentifizierung erforderlich, die ich per HTTP POST an den Webserver übermitteln möchte. Bei dieser ersten Verbindung hat das Script jedoch einige Zeit nicht mehr reagiert und anschließend eine Windows-Meldung geworfen, die auf das (ungültige) Zertifikat hinwies.
Für die Erstellung des Zugriffs verwende ich ein WinHttp.WinHttpRequest.5.1 Objekt welches ich mit ObjCreate erstelle. Anschließend prüfe ich, ob das Objekt erfolgreich erstellt wurde und breche im Fehlerfall die Funktion ab. Im Anschluss setze ich für die Option Nr. 4 den Wert 13056. Hiermit werden Fehler bzgl. SSL unterdrückt, die, wie in meinem Beispiel, durch ein nicht vertrauenswürdiges Zertifikat signiert sind.
Um den eigentlichen Login durchzuführen ist ein POST Kommando erforderlich, über welches der Benutzer und das Passwort an den Server übergeben wird. Damit man weiß, welche Inhalte ein solches Paket enthält, nutzt man normalerweise Network Paket Analyzer wie WireShark. Da es sich hier jedoch um eine SSL verschlüsselte Verbindung handelt, funktioniert dies nicht, da der Inhalt der Pakete nicht mehr sichtbar ist. Mit dem FireFox Plugin TamperData können wir dies jedoch umgehen. Hier können wir die Paketinhalte sehen, bevor diese verschlüsselt werden. Wie auf dem Screenshot zu sehen ist, ist der Parameter "username=torsten.feld&password=xxxxxx". Dieser muss einfach mit der Methode 'Send' an den Server geschickt werden.
Damit die Datei heruntergeladen werden kann, fehlt nur noch die Methode 'Open', welche den Pfad zu der Datei angibt und wiederum mit 'Open' versendet wird. Über die Methode 'responseText' bekommen wir die Rückgabe des Servers.
Die Informationen wie Useragent, Contenttype und Referrer, welche über 'SetRequestHeader' gesetzt werden können, sind meist erforderlich, können aber gerade bei Downloads von Servern, welche eine Steuerung über ein Script unterbinden wollen, hinter's Licht führen.
Fragen dürfen gerne in den Kommentaren gestellt werden. Und hier ist ein Beispielscript:
Local $lHttpResponse
Local $lBaseUrl = "https://xxxxxx.srv.xxxxx.com/"
$objhttp = ObjCreate("WinHttp.WinHttpRequest.5.1")
If Not IsObj($objhttp) Then
MsgBox(16,"Error","Could not connect to webserver")
SetError(1)
Return -1
EndIf
$objhttp.Option(4) = 13056 ; turns off ssl error messages and warnings
$objhttp.Open("POST", $lBmgtBaseUrl & "login", false)
$objhttp.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 4.0.20506)")
$objhttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
$objhttp.SetRequestHeader("Referrer", $lBmgtBaseUrl & "login")
$objhttp.Send("username=" & $lUsername & "&" & "password=" & $lPassword)
$objhttp.Open("POST", $lBmgtBaseUrl & "files/file.exe", false)
$objhttp.Send
$lHttpResponse = $objhttp.responseText



