Python - SSL - 错误的版本号

Tor*_*xed 14 python sockets ssl pyopenssl

这可能只是另一个未解决的线程,但无论如何我会填写一些信息.

我甚至连一秒钟都无法将我的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
Run Code Online (Sandbox Code Playgroud)

为了记录,如果它不明显或我错了,这是握手失败:)

我稍微修改了代码,尝试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)
Run Code Online (Sandbox Code Playgroud)

现在我得到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)
Run Code Online (Sandbox Code Playgroud)

这与"原生"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))
Run Code Online (Sandbox Code Playgroud)

这个作品"prefectly"在Firefox,而不是在谷歌浏览器.为什么?有什么不同?-.-

Cra*_*lus 7

如果您的代码中存在问题,我根本不知道Python会告诉您.
但错误很明显.客户端SSLv3仅支持您的服务器TLSv1.
因此,您应该启用对SSLv3客户端的支持或升级.

这条线似乎是问题:ssl_version=ssl.PROTOCOL_TLSv1.也许你还可以SSLv3在这里添加?

更新:
我发现浏览器之间存在问题.看看SSLv3Crome中是否启用了.
例如,在IE中,这是在Internet Options- > Advanced Tab.
类似的东西应该在Chrome中.禁用SSv3和启用TLSv1,而不是

  • @downvoter:谢谢您的评论(不!) (2认同)
  • 视情况而定。您可以同时支持 SSLv23 和 TLSv1,也可以放弃弱协议以支持 TLSv1。如果您的安全要求很强,那么向“客户端”指定如果最新的 TLS 可能存在连接问题,这不是问题未启用 (2认同)