【问题标题】:Python socket ssl connetionPython套接字ssl连接
【发布时间】:2016-08-19 09:05:26
【问题描述】:

这里是情景:

服务器通过主机10.10.10.1监听9999、9998这两个端口 客户端使用端口 9999,控制器使用端口 9998 我能够将客户端和控制器连接到服务器,并在没有 ssl 套接字的情况下从控制器控制客户端。 我想使用加密套接字我添加了 ssl 证书套接字连接,客户端也没有通过 SSL_SOCK 作为控制器连接到服务器。 感谢您的帮助或建议。

服务器:

    s=socket(AF_INET, SOCK_STREAM)
    s.bind(("10.10.10.1",9999))
    s.listen(5)
    port = 9999
    password = "password"
    bridgeport = 9998

    allConnections = []
    allAddresses = []

    def getConnections():
        for item in allConnections:
            item.close()

        del allConnections[:]
        del allAddresses[:]

        while 1:
            try:
                q,addr=s.accept()
                connstream = ssl.wrap_socket(q, server_side=True, certfile="server.crt", keyfile="server.key", ssl_version=ssl.PROTOCOL_SSLv23) 
                connstream.setblocking(1)
                allConnections.append(connstream)
                allAddresses.append(addr)

            except:
                print "YOU ARE NOT CONNECTED!! TRY AGAIN LATER"
                time.sleep(10.0)
                break
def main():
    bridge=socket(AF_INET, SOCK_STREAM)
    bridge.bind(("10.10.10.1",9998))
    bridge.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    while 1:
        bridge.listen(1)
        q,addr=bridge.accept()
        bridgestream = ssl.wrap_socket(q, server_side=True, certfile="server.crt", keyfile="server.key", ssl_version=ssl.PROTOCOL_SSLv23)

        cpass = bridgestream.recv(4096)
        if (cpass == password):
            print "Controller is connected"
        else:
            print "Controller not conected"
try:        
    main()
except:
    try:

        del allConnections[:]
        del allAddresses[:]
    except:
        pass

控制器:

host = '10.10.10.1'
port = 9998
password = "password"


def main():

    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ssl_sock = ssl.wrap_socket(s, ca_certs="server.crt", cert_reqs=ssl.CERT_REQUIRED)
        ssl_sock.connect((host, port))
    except:
        sys.exit("[ERROR] Can't connect to server")

    ssl_sock.sendall(password)

客户:

host = "10.10.10.1"
port = 9999
def main(host, port):
    while 1:
        connected = False
        while 1:
            while (connected == False):
                try:

                    print host
                    print port
                    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    print s
                    ssl_sock = ssl.wrap_socket(s, ca_certs="server.crt", cert_reqs=ssl.CERT_REQUIRED)
                    print "ssl_sock"
                    ssl_sock.connect((host,port))
                    print "Connected"
                    connected = True
                except:
                    print "The client not Connected yet"
                    time.sleep(5)
while 1:
    try:
        main(host, port)
    except:
        time.sleep(5)

【问题讨论】:

  • 毯子 except 不会帮助您很好地诊断任何问题
  • 添加 exeption 后,我通过从服务器绑定和从控制器连接 g 得到此错误:[Errno 10054] 现有连接被远程主机强行关闭服务器意外关闭

标签: python sockets ssl connection certificate


【解决方案1】:

我有类似的问题,建议两种方法:

  1. 首先尝试原始 TCP socket(没有ssl.wrap_socket())。如果可行,请使用诸如netstat 之类的工具来诊断使用了哪些端口和IP 地址,以防出现阻塞。
  2. 尝试在任一侧创建SSLContext,如下所示:
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS)
ssl_context.verify_mode = ssl.CERT_NONE
stream_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
_socket = ssl_context.wrap_socket(stream_socket, server_hostname=hostname)
_socket.connect((hostname, port))

换句话说,不要先强制使用证书并尝试指定协议。希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 2021-12-22
    • 2015-01-07
    • 2013-10-14
    • 2014-06-30
    • 1970-01-01
    • 2011-04-17
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多