2013-02-06 17 views
3

我正在爲一個類編寫一個簡單的服務器,並且有一個「創意」組件,所以我想向它添加SSL。我試圖把連接包裝在一個SSLSocket中,但是我得到了兩個我不能弄明白的錯誤。第一次發生在Safari,當我嘗試換插座,我得到:通過Safari和Firefox訪問時,Python SSL服務器SSLSocket SSLError

Traceback (most recent call last): 
    File "./junk.py", line 12, in <module> 
    connstream = ssl.wrap_socket(connected_socket,certfile="cert.pem",keyfile="cert.pem",server_side=True,cert_reqs=ssl.CERT_NONE,ssl_version=ssl.PROTOCOL_TLSv1,suppress_ragged_eofs=True) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 372, in wrap_socket 
    ciphers=ciphers) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 134, in __init__ 
    self.do_handshake() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 296, in do_handshake 
    self._sslobj.do_handshake() 
ssl.SSLError: [Errno 8] _ssl.c:503: EOF occurred in violation of protocol 

當Safari瀏覽器告訴用戶該證書是無效的(我創建通過命令自簽署證書:openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem) ,然後一旦我告訴它證書沒問題,下一次通過。

然而,與Firefox,我得到一個完全不同的錯誤,當我嘗試讀什麼客戶端(火狐)發送到服務器時,它發生了:

Traceback (most recent call last): 
    File "./junk.py", line 13, in <module> 
    recieved = connstream.read() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 151, in read 
    return self._sslobj.read(len) 
ssl.SSLError: [Errno 1] _ssl.c:1354: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca 

下面是我使用的代碼:

1 #!/usr/bin/python 
    2 import socket 
    3 import ssl 
    4 
    5 serverPort = 22222 
    6 serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    7 serverSocket.bind(('127.0.0.1', serverPort)) 
    8 serverSocket.listen(10) 
    9 
10 while True: 
11  connected_socket, from_addr = serverSocket.accept() 
12  connstream = ssl.wrap_socket(connected_socket,certfile="cert.pem",keyfile="cert.pem",server_side=True,cert_reqs=ssl.CERT_NONE,ssl_version=ssl.PROTOCOL_TLSv1,suppress_ragged_eofs=True) 
13  recieved = connstream.read() 
14  print recieved 
15  connstream.unwrap() 
16  connected_socket.close() 

誰能幫我明白了:

1)什麼這些錯誤意味着

2)爲什麼我讓他們

3)我如何去修復這些

(我搜索在幾乎每一個方式,我能想到的)

感謝,

安德魯

回答

2

對不起,我還不能評論:這不是一個答案。

爲什麼總是重新發明輪子?我的意思是,如果你想要基於python的東西,爲什麼不使用Tornado?順便說一句,你可以看到他們是如何解決這個問題的:http://www.tornadoweb.org/documentation/httpserver.html

人們似乎總是爲了「教育目的」或因爲現有解決方案過於「臃腫」,「沉重」等而重新發明輪子。總結「這裏沒有發明」)。 這是一個恥辱,因爲同樣的事情一遍又一遍地完成,通常是錯誤的。

Safari只是不尊重握手,當然是因爲您的證書是自簽名的。 Firefox不會接受您的證書,因爲它是自簽名的。 這些錯誤是正常的:用戶必須接受瀏覽器中的「可信」連接。與此同時,您的服務器沒有收到答覆或拒絕。

看看龍捲風看看他們是如何處理的。但我真的認爲你最好研究它,使用它併爲它做出貢獻,而不是創建一個全新的,破損的http服務器。

+3

從生產力的角度來看,使用一些現有的框架是有道理的,從「我知道我的計算機內部或互聯網上發生了什麼」的角度來看,你是一些簡單的代碼行,作爲一個白帽腳本小子。你不覺得嗎?還是)感謝你的建議。 – andrewm921

+0

是和否:你可以從其他人的代碼中學習*。龍捲風很容易理解和開源。通過查看他們的代碼(並嘗試讓你的工作),你會學到更多,而不僅僅是在這裏得到答案。不同之處在於,從現在起兩年後,您將重新實現其許多功能。這只是無用的。但是,如果您將自己的代碼庫作爲開始並實施新功能和新功能,那麼您仍然需要了解整個程序包的工作原理,網絡的工作方式以及您對社區的幫助。我的兩分錢。 – 2013-02-06 17:17:34

+0

好點 - 我完全同意。浪費時間來構建已經構建的東西是愚蠢的。也許'班'是模棱兩可的 - 我正在寫這個爲學校的班級(但SSL是一個額外的位,我加入了有趣的,不需要),所以使用Tornado不是一個選項。所有這一切,我想在幾天內實施一個小型服務器,看看它是如何工作的(即通過實踐學習),然後繼續爲Tornado做出貢獻是有教育意義的,並且沒有害處。 – andrewm921

相關問題