[Python-de] Authentifizierung bei https

"Martin v. Löwis" martin at v.loewis.de
Sam Mar 12 14:41:35 CET 2005


Dinu Gherman wrote:
> Ich moechte gern "hoeherwertigen" Zugriff auf meine Bank- und Telefondaten
> online bekommen. An diese komme ich meist ueber https heran (in Python wohl
> ueber urllib2), aber ich habe mich noch nicht soweit darin vertieft, wie 
> man da die Authentifizierung selbst vornimmt, ob man noch irgendein 
> zusaetzliches SSL-Modul braucht, etc? Vielleicht hat jemand ja schon eigene 
 > Erfahrung in diesem Bereich gesammelt?

Das hängt ganz vom Service ab. Wenn man auf diesen Service mit
Nutzername und Passwort zugreift, muss man das verwenden; wenn
er X.509-Zertifikate verwendet, muss man die benutzen. Wenn es
Passwörter sind, braucht man vielleicht Basic Authentification,
vielleicht gibt es aber auch ein Login-Formular, woraufhin man
dann ein Cookie erhält.

Für den Fall von Zertifikaten funktioniert folgender Code

import httplib

h = httplib.HTTPSConnection("localhost",
                             key_file="key.pem",
                             cert_file="cert.pem")
h.connect()
h.putrequest("GET", "/cgi-bin/env")
h.endheaders()

r = h.getresponse()
print r.read()

Ob Du da mit urllib draufzugreifen kannst, hängt ebenfalls vom Dienst
ab; im Zweifelsfall würde ich immer httplib direkt verwenden.

Ein konkretes Beispiel:

https://ww2.homebanking-berlin.de/cgi/anfang.cgi/Berliner_Sparkasse

bringt ein Formular hoch, was man mit Kontonummer und PIN ausfüllen
muss. Aus dem Quelltext der Seite geht hervor, dass man das ganze
an

https://ww2.homebanking-berlin.de/cgi/login.cgi/Berliner_Sparkasse

per HTTP-POST senden soll. Die Konto-Nummer muss man dabei im
Feld KtoNr und die PIN im Feld PIN absenden.

Dieses Scenario ist von urllib unterstützt; man schreibt dazu

x=urllib.urlopen("https://ww2.homebanking-berlin.de/cgi/login.cgi/Berliner_Sparkasse", 

                  urllib.urlencode({'KtoNr':'12345','PIN':'4567'}))

Ich kann leider nicht ausprobieren, was da normalerweise zurückkommt;
diese Anfrage produziert natürlich eine Fehlerseite.

Vermutlich sollte x.headers["Set-Cookie"] vorhanden sein, welches
man dann im weiteren immer wieder mitsenden muss. Dazu kann man in
2.4 cookielib benutzen; alternativ unterstützt
urllib2.HTTPCookieProcessor Cookies transparent. Den eigentlichen
Inhalt der Seite bekommt man mit x.read().

Ciao,
Martin