这可能只是另一个未解决的线程,但无论如何我都会填写一些信息。
我甚至连一秒钟都无法将我的SSL包装在一起。 我对wrap_socket()和do_handshake()做错了什么想法?
密钥文件似乎100%完美,我在握手之前尝试过没有.recv()的AND。 这只是根据我把recv()的位置生成这些:
SSL3_GET_CLIENT_HELLO:版本号错误
SSL3_GET_RECORD:版本号错误
class Server():
def __init__(self, listen = '', port = 8080, ssl = False):
self.sock = socket.socket()
self.sock.bind((listen, port))
self.sock.listen(5)
def accept(self):
newsocket, fromaddr = self.sock.accept()
newsocket.recv(32)
newsocket.setblocking(0)
sslsock = ssl.wrap_socket(newsocket,
server_side=True,
certfile="./kernel/sock/server.crt",
keyfile="./kernel/sock/server.key",
cert_reqs=ssl.CERT_NONE,
ssl_version=ssl.PROTOCOL_TLSv1,
do_handshake_on_connect=False,
suppress_ragged_eofs=True)
sslsock.do_handshake()
return sslsock, fromaddr
对于记录,如果它不明显或我错了,那就是握手失败了:)
我稍微修改了代码,尝试使用SSLv3并稍微改变了包装的位置:
import socket, ssl, time, select
class Server():
def __init__(self, listen = '', port = 443, ssl = False):
self.sock = socket.socket()
self.sock.bind((listen, port))
self.sock.listen(5)
def accept(self):
self.sock = ssl.wrap_socket(self.sock,
server_side=True,
certfile="./kernel/sock/server.crt",
keyfile="./kernel/sock/server.key",
cert_reqs=ssl.CERT_NONE,
ssl_version=ssl.PROTOCOL_SSLv3,
do_handshake_on_connect=False,
suppress_ragged_eofs=True)
newsocket, fromaddr = self.sock.accept()
print [newsocket.recv(32)]
newsocket.setblocking(False)
newsocket.do_handshake()
return newsocket, fromaddr
s = Server()
ns, na = s.accept()
print ns.recv(1024)
现在我得到了newsocket.recv(32):
ssl.SSLError:[Errno 1] _ssl.c:1331:错误:140940E5:SSL例程:SSL3_READ_BYTES:ssl握手失败
且没有:
ssl.SSLError:[Errno 2] _ssl.c:490:操作没有完成(阅读)
另外:我拒绝使用Twisted
缩小规模:
import socket, ssl, time, select
from OpenSSL import SSL
class Server():
def __init__(self, listen = '', port = 443, ssl = False):
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file("server.pem")
ctx.use_certificate_file("server.pem")
self.sock = SSL.Connection(ctx, socket.socket())
self.sock.bind((listen, port))
self.sock.listen(5)
def accept(self):
newsocket, fromaddr = self.sock.accept()
return newsocket, fromaddr
s = Server()
ns, na = s.accept()
print ns.recv(1024)
这与“原生”ssl库一样好用。 但是现在我收到了这个错误:
OpenSSL.SSL.Error:[('SSL例程','SSL23_READ','ssl握手失败')]
这就是我现在所处的位置:
import socket, ssl, time #, select
class Server():
def __init__(self, listen = '', port = 443, ssl = False):
self.sock = socket.socket()
self.sock.bind((listen, port))
self.sock.listen(5)
def accept(self):
self.ssl_sock = None
while not self.ssl_sock:
self.ssl_sock = ssl.wrap_socket(self.sock,
server_side=True,
certfile=r"C:\moo.pem",
keyfile=r"C:\moo.key",
cert_reqs=ssl.CERT_NONE,
ssl_version=ssl.PROTOCOL_TLSv1)
newsocket, fromaddr = self.ssl_sock.accept()
print([newsocket.recv()])
return newsocket, fromaddr
s = Server()
ns, na = s.accept()
print(ns.recv(1024))
这在Firefox中“完美”,但在谷歌浏览器中不。 为什么?有什么不同? -.-
答案 0 :(得分:7)
我根本不知道Python是否会告诉您代码中是否存在问题
但错误很明显。客户端仅支持SSLv3
和您的服务器TLSv1
因此,您应该启用对SSLv3
的支持或升级您的客户端。
这一行似乎是问题所在:ssl_version=ssl.PROTOCOL_TLSv1
。也许你也可以在这里添加SSLv3
?
更新:
我发现浏览器之间存在问题。查看Crome中是否启用了SSLv3
例如,在IE中,这是在Internet Options
- >下Advanced Tab
。
类似的东西应该在Chrome中。停用SSv3
并启用TLSv1