2016-05-20 31 views
4

我有一个使用自签名证书的Python SSL服务器在Firefox连接后立即转储错误。我开始我的服务器是这样的:Python ssl服务器报告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() 

我当我连接使用的是Firefox得到了一个错误:

---------------------------------------- 
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) 
---------------------------------------- 

我没有看到浏览器或其他客户端此行为。它只发生在第一次连接(关于证书的投诉),直到我接受证书。异常实际上不会导致程序退出。

为什么我在服务器上发生错误?我如何避免异常?

+1

难道是因为Firefox发送客户端证书? –

+0

我不确定,但我的代码不应检查客户端证书(cert_reqs = 0)。它似乎是特定于Firefox。 (我在问题中增加了更多细节)。 –

+0

请注意,现在letsencrypt存在,没有理由再使用自签名证书。 –

回答

5

TLv1 unknown CA警告是由某些客户端发送的,如果它们由于未知发行者CA签署而无法验证服务器的证书。如果您使用客户端已经信任的证书或可以针对客户端的根CA进行验证的证书(不要忘记也包含链式证书),则可以避免此类异常。

如果您无法避免此错误(例如因为您正在使用自签名证书),则必须通过关闭连接来捕获异常并进行处理。您可能需要使用handle_request来处理每个请求本身,并捕获异常而不是使用serve_forever

+0

谢谢。我很困惑为什么服务器在客户端抱怨未知的CA。现在它是有道理的。 –