In your code, you are calling:
sslcontext.load_cert_chain(cert, keyfile=ca_cert)
From the documentation:
Load a private key and the corresponding certificate. The certfile
string must be the path to a single file in PEM format containing the
certificate as well as any number of CA certificates needed to
establish the certificate’s authenticity. The keyfile string, if
present, must point to a file containing the private key in. Otherwise
the private key will be taken from certfile as well. See the
discussion of Certificates for more information on how the certificate
is stored in the certfile.
Based on the name of the arguments in your example, it looks like you are passing a CA certificate to the keyfile
argument. That is incorrect, you need to pass in the private key that was used to generate your local certificate (otherwise the client cannot use your certificate). A private key file will look something like:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,9BA4973008F0A0B36FBE1426C198DD1B
...data...
-----END RSA PRIVATE KEY-----
You only need the CA certificate if you are trying to verify the validity of SSL certificates that have been signed by this certificate. In that case, you would probably use SSLContext.load_verify_locations()
to load the CA certificate (although I have not worked with the SSL module recently, so don't take my word on that point).