尝试SSL连接时,服务器强制关闭连接

时间:2017-11-26 02:27:07

标签: python python-3.x ssl

我试图在服务器和客户端之间创建一个ssl连接,但我一直收到ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine错误。

client.py

class Client(object):
    def __init__(self):
        threading.Thread(target=self.init_sock).start()
    def init_sock(self):
        host = 'localhost'
        port = 49374
        baresock = socket(AF_INET6, SOCK_STREAM)
        context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
        self.servsock = context.wrap_socket(baresock, server_hostname=host)
        try:
            self.servsock.connect((host, port))  #<--- Line error is being thrown at
            logging.info("Connection Successful")
        except:
            logging.info("Connection Problem")
            return
        threading.Thread(target=self.listen_loop).start()

server.py

class ClientHandler(socketserver.BaseRequestHandler):
    def handle(self):
        pass

class Server(socketserver.ThreadingTCPServer):
    srvhost = ''
    srvport = 49374

    def __init__(self,
                 request_handler_class=ClientHandler,
                 certfile="../scache/cert.pem",
                 keyfile="../scache/key.pem",
                 ssl_version=ssl.PROTOCOL_TLSv1_2,
                 bind_and_activate=True):
        self.address_family = socket.AF_INET6
        self.certfile = certfile
        self.keyfile = keyfile
        self.ssl_version = ssl_version
        server_address = (self.srvhost, self.srvport)
        super(Server, self).__init__(server_address, request_handler_class, bind_and_activate)

    def get_request(self):
        newsocket, fromaddr = self.socket.accept()
        context = ssl.create_default_context()
        context.load_cert_chain(certfile=self.certfile, keyfile=self.keyfile) # <------ Hanging Here
        logging.info("New Request from " + fromaddr[0])
        connstream = context.wrap_socket(newsocket, server_side=True)
        logging.info("Socket Wrapped")
        return connstream, fromaddr

当我尝试从客户端连接到服务器时,客户端会抛出WinError 10054,如上所述。当我尝试在服务器端使用调试器时,我可以将错误跟到socketserver.py的{​​{1}}方法,其中_handle_request_noblock引发了OSError。完全追溯:

request, client_address = self.get_request()

导致此错误的原因是什么,如何排除故障?感谢。

1 个答案:

答案 0 :(得分:1)

为了复制这个,我使用了您的代码并遇到了同样的问题,然后意识到我错过了构造函数中引用的.duotone-background { display: inline-block; height: 386px; position: relative; width: 640px; vertical-align: top; &:before, &:after { content: ""; opacity: 1; pointer-events: none; position: absolute; top: 0; right: 0; bottom: 0; left: 0; transition: 0.5s; -webkit-transition: 0.5s; } &:before { background: $dark_blue; mix-blend-mode: color; z-index: 1; } &:after { background: $white_blue; mix-blend-mode: color; z-index: 2; } &:hover { filter: none; -webkit-filter: none; &:before, &:after { opacity: 0; transition: 0.5s; -webkit-transition: 0.5s; } div { filter: none; -webkit-filter: none; } } div { width: 100%; height: 100%; background-size: cover; filter: grayscale(1) contrast(1) brightness(1); -webkit-filter: grayscale(1) contrast(1) brightness(1); } } certfile。我使用以下代码生成文件并将它们放在相对路径中:

keyfile

一旦我生成了您记下的certfile和密钥文件,from OpenSSL import SSL, crypto CRT_PATH = "../scache/cert.pem" # self-signed certificate KEY_PATH = "../scache/key.pem" # private key used to sign the certificate def generate_key(): """ Generate a private key and dump it to the key file. :return: key """ key = crypto.PKey() key.generate_key(crypto.TYPE_RSA, 4096) with open(KEY_PATH, "w") as keyfile: keyfile.write(bytes.decode(crypto.dump_privatekey(crypto.FILETYPE_PEM, key))) return key def generate_crt(key): """ Generate a self-signed certificate. :return: certificate """ crt = crypto.X509() crt.get_subject().C = "US" crt.get_subject().ST = "New York" crt.get_subject().L = "New York" crt.get_subject().O = "CompanyName" crt.get_subject().OU = "UnitName" crt.get_subject().CN = "localhost" crt.set_pubkey(key) crt.set_serial_number(101010) crt.gmtime_adj_notBefore(0) crt.gmtime_adj_notAfter(10 * 365 * 24 * 60 * 60) crt.sign(key, 'sha256') # Self-sign with open(CRT_PATH, "w") as crtfile: crtfile.write(bytes.decode(crypto.dump_certificate(crypto.FILETYPE_PEM, crt))) return crt if __name__ == "__main__": generate_crt(generate_key()) 就不再抛出,应用程序可以继续握手。这让我相信问题的可能罪魁祸首是certfile / keyfile的无效路径,或者文件无效。

您可以将路径调整为您需要的路径(我假设此脚本与client.py和server.py位于同一位置)您可能应该将证书的参数调整为任何您需要你的特定应用程序。