2016-05-20 30 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。現在它是有道理的。 –