通过Safari和Firefox访问时,Python SSL服务器SSLSocket SSLError

时间:2013-02-06 05:30:49

标签: python sockets ssl ssl-certificate self-signed

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

(我几乎可以通过各种方式进行搜索)

谢谢,

安德鲁

1 个答案:

答案 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服务器。