我正在为一个类编写一个简单的服务器,并且有一个“创意”组件,所以我想为它添加SSL。我正在尝试将连接包装在SSLSocket中,但是我得到了两个我无法解决的错误。当我尝试包装套接字时,第一次发生在Safari上,我得到:
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,我得到一个完全不同的错误,当我尝试读取客户端(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)我如何解决这些问题
(我几乎可以通过各种方式进行搜索)
谢谢,
安德鲁
答案 0 :(得分:2)
对不起,我无法发表评论:这不是一个答案。
为什么总是重新发明轮子?我的意思是,如果你想要基于python的东西,为什么不使用Tornado?顺便说一下,你可以看到他们如何在那里解决这个问题:http://www.tornadoweb.org/documentation/httpserver.html
人们似乎总是为了教育目的而重新发明轮子&#34;或者因为现有的解决方案太过臃肿&#34;,&#34;沉重的&#34;等等(好吧,总结一下&#34; Not Invented Here &#34; )。 这是一种耻辱,因为同样的事情一遍又一遍地完成,通常是错误的方式。
Safari只是不尊重握手,当然因为您的证书是自签名的。 Firefox只是不接受你的证书,因为它是自签名的。 这些错误是正常的:用户必须接受&#34;信任&#34;浏览器中的连接。同时,您的服务器没有收到任何答复或拒绝。
看看龙卷风看看他们是如何处理的。但我真的认为你应该更好地研究它,使用它并为它做出贡献,而不是创造一个全新的,半破坏的http服务器。