我试图在服务器和客户端之间创建一个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()
导致此错误的原因是什么,如何排除故障?感谢。
答案 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位于同一位置)您可能应该将证书的参数调整为任何您需要你的特定应用程序。