3

我正在为一个类编写一个简单的服务器,并且有一个“创意”组件,所以我想向它添加 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)我该如何解决这些问题

(我已经搜索了几乎所有我能想到的方式)

谢谢,

安德鲁

4

1 回答 1

2

对不起,我还不能发表评论:这不是一个答案。

为什么总是重新发明轮子?我的意思是,如果你想要基于 python 的东西,为什么不使用 Tornado 呢?顺便说一句,你可以在那里看到他们如何解决这个问题:http ://www.tornadoweb.org/documentation/httpserver.html

人们似乎总是为了“教育目的”或者因为现有的解决方案过于“臃肿”、“沉重”等而重新发明轮子(好吧,总结一下“这里没有发明”)。这是一种耻辱,因为同样的事情一遍又一遍地做,通常是错误的方式。

Safari 只是不尊重握手,当然是因为您的证书是自签名的。Firefox 只是不会接受您的证书,因为它是自签名的。这些错误是正常的:用户必须接受浏览器中的“可信”连接。同时,您的服务器没有收到任何答复或拒绝。

看看 Tornado 看看他们是如何处理的。但我真的认为你最好研究它,使用它并为它做出贡献,而不是创建一个全新的、半损坏的 http 服务器。

于 2013-02-06T10:09:30.333 回答