首页 > 解决方案 > 如何使用 python ssl 为 tls 连接设置证书

问题描述

我已经为此苦苦挣扎了几天。我有一个正在运行的 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]}")

我的问题是,如果我要从头开始生成证书以用于此服务器和客户端,我会怎么做?

标签: pythonsslnetworkingnetwork-programmingcertificate

解决方案


推荐阅读