我已经为此苦苦挣扎了几天。我有一个 tls 服务器正在运行,并且在连接到它的另一台机器上有一些 c 代码。当我尝试连接时出现错误:
ssl.SSLError: [SSL: TLSV2_ALERT_UNKNOWN_CA] tlsv2 alert unknown ca
我猜这是因为客户端证书是自签名的,因此服务器无法识别 ca。我想解决这个问题的一种方法是以某种方式将客户端的证书存储在服务器上,这样当它连接到它时就可以验证证书,因为它已经将它存储为受信任的。至于如何做到这一点,我不确定。我已经看到了方法“context.load_verify_locations('path/to/cabundle.pem')”,但我不确定哪个证书/如何为此方法参数生成证书。 我一直在循环生成证书并尝试许多不同的方法。所以现在我只想从头开始生成它,但我真的无法在网上找到任何有效的帮助。
这是我的服务器代码:
from socket import socket, AF_INET, SOCK_STREAM, SOCK_DGRAM
import ssl
import os
certs_path = "certs/"
SERVER_CERT = os.path.join(certs_path, "dev_server.crt")
SERVER_KEY = os.path.join(certs_path, "dev_server.key")
ip = '127.0.0.1'
port = 8443
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain(SERVER_CERT, SERVER_KEY)
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(('', port))
sock.listen(5)
print(f"Listening for TCP connections on port: {port}")
while True:
connection, sender = sock.accept()
sec_sock = context.wrap_socket(connection, server_side=True)
request = sec_sock.read()
decoded = request.decode("utf-8")
print(f"Received {decoded} from {sender[0]}:{sender[1]}")
我的问题是,如果我要从头开始生成证书以与此服务器和客户端一起使用,我该怎么做?