Ü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') 
  • 'Module' hat kein Attribut 'urlencode'
  • Javascript unescape () vs. Python urllib.unquote ()
  • Python: Wie bekomme ich die Dauer des Betrachtens des Videos durch den Benutzer aus Protokollen
  • Python urllib Herunterladen von Inhalten eines Online-Verzeichnisses
  • UnicodeDecodeError: 'utf-8' codec kann den Bytefehler nicht decodieren
  • Wie kann ich diesen IOError beheben: [Errno Socket-Fehler] [Errno 11004]?
  • Python, das Webform mit Anfragen einreicht
  • Python 3.2: urllib, SSL und TOR durch Sockel: Fehler mit Fileno-Funktion
  • Wie bekomme ich python, um große Bilder aus dem Internet erfolgreich herunterzuladen
  • Wie kann ich eine Prozent codierte URL aus der vollständigen URL erstellen?
  • Json parsing mit python
  • Python ist die beste Programmiersprache der Welt.