/ / Clientseitiges Autorisierungszertifikat an HTTPS Site senden - Python - Python, Mechanize, Python-Anfragen, Client-Zertifikate

Senden clientseitigen Autorisierungszertifikat an HTTPS-Site - Python - Python, Mechanisieren, Python-Anfragen, Client-Zertifikate

Ich hatte einen langen, langen Tag, an dem ich versuchte, ein Client Authorization-Zertifikat zu bekommen, das mit beiden funktionierte mechanize oder requests und haben schließlich darauf zurückgegriffen IEC für Automatisierung, die glücklicherweise einfach ist -bis jetzt. Ich muss nur klicken, um "Ja, benutze dieses Zertifikat" zu sagen, und dann füllt die Automatisierung Formulare aus, findet die Links und versucht, die Dateien herunterzuladen.

Ich bin auf der Bühne der Erziehung Open Save Cancel Dialog für die erste Datei, aber kann nicht sehen, wie man damit interagiert. Googling around ich bin nicht sicher, dass es möglich ist, ohne Mausklicks zu verwenden, die wie Overkill scheinen und ich kann nicht bekommen SendKeys.py (Verknüpfung) um zu arbeiten, wie ich anscheinend missbrauche vcvarsall.bat.

Alles scheint heute eine Sackgasse zu sein!

Es gibt also wirklich zwei Fragen.

1) Gibt es eine Möglichkeit zu bestehen? cert.pem und key.pem Dateien zu entweder requests oder mechanize? (meine bevorzugte Route)

Meine jetzige mechanize Code hier ist:

br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.open(root_url + "/home.html")
# Hangs on the following line due to not passing Client Certificate
r = br.open(root_url + "/secure/secureTerms.html")

Traceback wenn es irgendwann ausläuft ist:

Traceback (most recent call last):
File "C:UsersJamieDropboxworkspaceXXXXXXXXXXmyfile.py", line 29, in <module>
r = br.open("https://www.example.com/secure/authorisedUsers.html")
File "buildbdist.win32eggmechanize_mechanize.py", line 203, in open
File "buildbdist.win32eggmechanize_mechanize.py", line 230, in _mech_open
File "buildbdist.win32eggmechanize_opener.py", line 193, in open
File "buildbdist.win32eggmechanize_urllib2_fork.py", line 344, in _open
File "buildbdist.win32eggmechanize_urllib2_fork.py", line 332, in _call_chain
File "buildbdist.win32eggmechanize_urllib2_fork.py", line 1170, in https_open
File "buildbdist.win32eggmechanize_urllib2_fork.py", line 1116, in do_open
File "C:Python27Libhttplib.py", line 1025, in getresponse
response.begin()
File "C:Python27Libhttplib.py", line 401, in begin
version, status, reason = self._read_status()
File "C:Python27Libhttplib.py", line 365, in _read_status
raise BadStatusLine(line)
httplib.BadStatusLine: ""

Und mein requests Code ist:

    agent = requests.session()
agent.get(root_url + "/home.html")
data = {"redirectPage":"reportSearchAddressByPostcode",
"accept":"Accept Terms"}
agent.post(URL, data=data, headers=hdr)
# Again, this hangs on the following line
response = agent.get(root_url + "/secure/secureTerms.html", headers=hdr)

Und hier ist der Traceback, von dem ich komme requests:

Traceback (most recent call last):
File "C:UsersJamieDropboxworkspaceXXXXXXXXXXmyfile.py", line 27, in <module>
headers=hdr, cert=("cert.pem", "key.pem"))
File "C:Python27libsite-packagesrequestssessions.py", line 363, in get
return self.request("GET", url, **kwargs)
File "C:Python27libsite-packagesrequestssessions.py", line 347, in request
resp = self.send(prep, **send_kwargs)
File "C:Python27libsite-packagesrequestssessions.py", line 460, in send
r = adapter.send(request, **kwargs)
File "C:Python27libsite-packagesrequestsadapters.py", line 327, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host="www.example.com", port=443): Max retries exceeded with url: /secure/authorisedUsers.html (Caused by <class "httplib.BadStatusLine">: "")

2) Oder gibt es eine Möglichkeit, den Open Save Cancel zu umgehen oder durchzuklicken? (akzeptabler Klud)

BEARBEITEN

Ich habe es in cURL versucht und es funktioniert gut mit den folgenden Parametern:

curl -k -v --key key.pem --cert cert.pem https://www.example.com/secure/authorisedUsers.html

Der Server antwortet mit:

* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*        subject: OU=Go to https://www.name.com/repository/index.html; OU=Name
SSL123 certificate; OU=Domain Validated; CN=www.example.com
*        start date: 2012-12-03 00:00:00 GMT
*        expire date: 2013-12-03 23:59:59 GMT
*        issuer: C=US; O=Name, Inc.; OU=Domain Validated SSL; CN=Name DV SSL
CA
*        SSL certificate verify result: unable to get local issuer certificate (
20), continuing anyway.
> GET /secure/authorisedUsers.html HTTP/1.1
> User-Agent: curl/7.30.0
> Host: www.example.com
> Accept: */*
>
* SSLv3, TLS handshake, Hello request (0):
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Request CERT (13):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS handshake, CERT verify (15):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
< HTTP/1.1 302 Moved Temporarily
< Date: Fri, 21 Jun 2013 00:52:44 GMT
< Set-Cookie: site-text-size=medium; Domain=www.example.com; Expires=Sat,
21-Jun-2014 00:52:44 GMT; Path=/
< Set-Cookie: user=SITE_MEMBER_V2; Domain=www.example.com; Path=/
< Location: https://www.example.com/secure/addressSearch.html
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=utf-8
<
<html><body><p>Redirecting to <a href="https://www.example.com/secure/addr
essSearch.html">https://www.example.com/secure/addressSearch.html</a></p><
/body></html>* Closing connection 0
* SSLv3, TLS alert, Client hello (1):

Das ist alles, was ich erwartet habe, also gibt es hier etwas, das andeutet, warum es in Python versagt?

Antworten:

1 für die Antwort № 1

So geben Sie die Clientzertifikate an, die für diese HTTPS-Sitzung verwendet werden sollen:

Mechanisieren

br = mechanize.Browser()
br.add_client_certificate(myurl, mykey, cert)
br.set_handle_robots( False )
#httplib.HTTPSConnection.connect = connect
resp = br.open(myurl)

Anfragen

resp = requests.get("<https_url>", cert=(mycert, mykey), verify=False)

Update: Ich habe den Code für Mechanisieren bearbeitet. Wir müssen verwenden add_client_certificate API mit der Browser() Instanz, um das Client-Zertifikat anzugeben.