2017-11-26 22 views
2

サーバーとクライアントの間でssl接続を作成しようとしていますが、引き続きConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machineエラーが発生します。SSL接続を強制しようとするとサーバーが強制的に接続を閉じる

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_handle_request_noblockメソッドにエラーが続き、request, client_address = self.get_request()がOSErrorをスローしています。フルトレースバック:

Traceback (most recent call last): 
    File "C:\Program Files\Anaconda3\lib\threading.py", line 916, in _bootstrap_inner 
    self.run() 
    File "C:\Program Files\Anaconda3\lib\threading.py", line 864, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:/Project/src/client.py", line 36, in init_sock 
    self.servsock.connect((host, port)) 
    File "C:\Program Files\Anaconda3\lib\ssl.py", line 1093, in connect 
    self._real_connect(addr, False) 
    File "C:\Program Files\Anaconda3\lib\ssl.py", line 1084, in _real_connect 
    self.do_handshake() 
    File "C:\Program Files\Anaconda3\lib\ssl.py", line 1061, in do_handshake 
    self._sslobj.do_handshake() 
    File "C:\Program Files\Anaconda3\lib\ssl.py", line 683, in do_handshake 
    self._sslobj.do_handshake() 
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host 

このエラーの原因は何ですか?また、トラブルシューティングを行うにはどうすればよいですか。ありがとう。

+0

フルOSErrorを含めることはできますか? –

+0

フルトレースバックを追加しました。 – JGrindal

+0

これはクライアント側です...ちょうどsslハンドシェイクが失敗したように見えます。サーバー側のOSErrorは何ですか?何らかの理由で証明書を読み込めないようです。 btw、あなたは証明書をインストールしましたか(pipなど)? 試し: 要求、client_address =自己 –

答えて

1

これを複製しようとすると、私はあなたのコードを使用して同じ問題を抱え、certfilekeyfileがコンストラクタで参照されていないことに気付きました。私は、ファイルを生成しませんし、次のコードを使用して、相対パスに入れ:

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にしてキーファイルを生成したら、OSErrorが投げなくなったとアプリが握手を続けることができます。これにより、問題の原因が証明書ファイルまたはキーファイルへの無効なパスであるか、ファイルが無効であると考えられます。

あなたが必要とするパスを調整することができます(このスクリプトはclient.pyとserver.pyと同じ場所にあると仮定しています)、証明書のパラメータを何かに調整する必要がありますあなたはあなたの特定のアプリのために必要です。

関連する問題