2016-05-20 3 views
4

Ich habe einen Python SSL-Server, der selbstsignierte Zertifikat-Dumps verwendet, sobald Firefox eine Verbindung herstellt. Ich beginne meine Server wie folgt:Python ssl server reporting TLSV1_ALERT_UNKNOWN_CA

httpd = BaseHTTPServer.HTTPServer(('', 443), MyHTTPHandler) 
httpd.socket = ssl.wrap_socket (httpd.socket, certfile='server.pem', server_side=True, cert_reqs=0) 
httpd.serve_forever() 

ich einen Fehler bekam, wenn ich Firefox Verbindung über:

---------------------------------------- 
Exception happened during processing of request from ('127.0.0.1', 51194) 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 321, in process_request 
    self.finish_request(request, client_address) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 655, in __init__ 
    self.handle() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 340, in handle 
    self.handle_one_request() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 310, in handle_one_request 
    self.raw_requestline = self.rfile.readline(65537) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 480, in readline 
    data = self._sock.recv(self._rbufsize) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 734, in recv 
    return self.read(buflen) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 621, in read 
    v = self._sslobj.read(len or 1024) 
SSLError: [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:1751) 
---------------------------------------- 

ich dieses Verhalten nicht mit Chrome oder einen anderen Kunden sehen. Es passiert nur bei der ersten Verbindung (Beschwerden über das Zertifikat), bis ich das Zertifikat akzeptiere. Die Ausnahme bewirkt nicht, dass das Programm beendet wird.

Warum erhalte ich einen Fehler auf dem Server? Wie kann ich die Ausnahme vermeiden?

+1

Könnte es sein, dass Firefox ein Client-Zertifikat sendet? –

+0

Ich bin mir nicht sicher, aber mein Code sollte nicht nach dem Client-Zertifikat (cert_reqs = 0) suchen. Es scheint spezifisch für Firefox zu sein. (Ich fügte der Frage weitere Details hinzu). –

+0

Beachten Sie, dass jetzt, da letsencrypt existiert, kein Grund mehr besteht, selbstsignierte Zertifikate zu verwenden. –

Antwort

5

Die Warnung TLv1 unknown CA wird von einigen Clients gesendet, wenn sie das Zertifikat des Servers nicht überprüfen können, da es von einer unbekannten Aussteller-CA signiert wurde. Sie können diese Art von Ausnahme vermeiden, wenn Sie ein Zertifikat verwenden, dem der Client bereits vertraut hat oder das für eine Stammzertifizierungsstelle des Clients validiert werden kann (Vergessen Sie nicht, auch die Kettenzertifikate einzubeziehen).

Wenn Sie diesen Fehler nicht vermeiden können (z. B. weil Sie ein selbstsigniertes Zertifikat verwenden), müssen Sie die Ausnahme abfangen und damit umgehen, indem Sie die Verbindung schließen. Sie müssen dies möglicherweise tun, indem Sie handle_request verwenden, um jede Anforderung selbst zu behandeln und Ausnahmen abzufangen, anstatt serve_forever zu verwenden.

+0

Danke. Ich war verwirrt, warum der Server sich über unbekannte CA auf einem Client beschwert. Jetzt macht es Sinn. –

Verwandte Themen