Überprüfen von HTTPS-Zertifikaten mit urllib.request

Ich versuche, eine https URL mit der urlopen Methode in Python 3's urllib.request Modul zu urllib.request . Es scheint gut zu funktionieren, aber die Dokumentation warnt, dass "[i] f weder cafile noch capath angegeben ist, eine HTTPS-Anfrage wird keine Überprüfung des Server-Zertifikats".

Ich vermute, dass ich einen dieser Parameter angeben muss, wenn ich nicht möchte, dass mein Programm anfällig für Man-in-the-Middle-Angriffe, Probleme mit widerrufenen Zertifikaten und anderen Schwachstellen ist.

cafile und capath sollen auf eine Liste der Zertifikate hinweisen. Wo soll ich diese Liste bekommen? Gibt es eine einfache und plattformübergreifende Möglichkeit, die gleiche Liste von Zertifikaten zu verwenden, die mein Betriebssystem oder Browser benutzt?

3 Solutions collect form web for “Überprüfen von HTTPS-Zertifikaten mit urllib.request”

Sie können die Zertifikate Mozilla in einem Format herunterladen, das für urllib (zB PEM-Format) unter http://curl.haxx.se/docs/caextract.html verwendet werden kann

Ich habe eine Bibliothek gefunden, die das tut, was ich versuche zu tun: Certifi . Es kann durch das Ausführen von pip install certifi über die Befehlszeile pip install certifi werden.

Anfragen zu machen und zu überprüfen, ist jetzt einfach:

 import certifi import urllib.request urllib.request.urlopen("https://example.com/", cafile=certifi.where()) 

Wie ich erwartet habe, gibt dies ein HTTPResponse Objekt für eine Website mit einem gültigen Zertifikat und hebt eine ssl.CertificateError Ausnahme für eine Website mit einem ungültigen Zertifikat.

Verschiedene Linux-Distributoren haben unterschiedliche Packennamen. Ich habe in Centos und Ubuntu getestet. Diese Zertifikatsbündel sind Aktualisierungen mit Systemupdate. So können Sie nur erkennen, welches Bündel verfügbar ist und verwenden Sie es mit urlopen .

 cafile = None for i in [ '/etc/ssl/certs/ca-bundle.crt', '/etc/ssl/certs/ca-certificates.crt', ]: if os.path.exists(i): cafile = i break if cafile is None: raise RuntimeError('System CA-certificates bundle not found') 
  • Python 3 - urllib, HTTP Fehler 407: Proxy-Authentifizierung erforderlich
  • Wie verarbeite ich das Zeitlimit von urllib in Python 3?
  • Warum habe ich unordentlich Charaktere beim Öffnen von url mit urllib2?
  • Download pdf mit urllib?
  • Python urllib Herunterladen von Inhalten eines Online-Verzeichnisses
  • Versuche, Multipart-Formulardaten in Python zu posten, wird nicht posten
  • Füge nur zu einem Dict hinzu, wenn eine Bedingung erfüllt ist
  • Verwenden von urllib und minidom, um XML-Daten abzurufen
  • Wie kann ich eine GzipFile-Instanz aus dem "file-like object" erstellen, die urllib.urlopen () zurückgibt?
  • Python authentifizieren und starten private Seite mit webbrowser, urllib und CookieJar
  • Python httplib / urllib erhalten Dateiname
  • Python ist die beste Programmiersprache der Welt.