You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DTLS UDP加密客户端/服务端程序开发:s.connect()使用异常求助

DTLS加密UDP通信问题修复方案

问题根源

  • 未配置DTLS必需的证书与密钥,导致握手流程无法完成
  • 客户端调用connect()后,DTLS握手未完成阻塞了后续逻辑;不调用connect()时,SSL包装未实际生效,数据以明文传输

修复步骤及代码

1. 生成测试用自签名证书

先通过OpenSSL生成测试所需的证书和密钥:

openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes

2. 修复后的DTLS服务端代码

import socket
import ssl
from dtls import do_patch

do_patch()

# 服务器地址与端口
serverAddress = "192.168.1.158"
serverPort = 12345

# 配置DTLS服务端上下文,加载证书链
context = ssl.SSLContext(ssl.PROTOCOL_DTLS_SERVER)
context.load_cert_chain(certfile="server.crt", keyfile="server.key")

# 创建UDP套接字并绑定地址
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((serverAddress, serverPort))

# 包装为DTLS套接字
dtls_sock = context.wrap_socket(sock, server_side=True)

print("DTLS服务器已启动,等待客户端连接...")

# 持续处理客户端通信
while True:
    try:
        # 自动处理DTLS握手,接收加密数据
        data, addr = dtls_sock.recvfrom(4096)
        print(f"来自客户端 {addr} 的加密数据: {data.decode('utf-8')}")
        
        # 加密回复客户端
        response = f"服务器收到: {data.decode('utf-8')}".encode("utf-8")
        dtls_sock.sendto(response, addr)
        
        # 处理退出指令
        if data.decode('utf-8') == "!quit":
            print("客户端请求退出,关闭连接")
            break
    except Exception as e:
        print(f"通信错误: {e}")
        break

dtls_sock.close()

3. 修复后的DTLS客户端代码

import socket
import ssl
from dtls import do_patch

do_patch()

# 服务器地址与端口
serverAddress = "192.168.1.158"
serverPort = 12345

# 配置DTLS客户端上下文,测试环境临时禁用证书验证
context = ssl.SSLContext(ssl.PROTOCOL_DTLS_CLIENT)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE

# 创建UDP套接字并包装为DTLS套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dtls_sock = context.wrap_socket(sock, server_hostname=serverAddress)

# 触发DTLS握手
dtls_sock.connect((serverAddress, serverPort))
print("已完成DTLS握手,可开始发送数据")

# 持续与服务器交互
while True:
    user_input = input("输入要发送给服务器的内容(输入!quit退出): ")
    dtls_sock.send(user_input.encode("utf-8"))
    
    if user_input == "!quit":
        break
    
    # 接收服务器加密回复
    data = dtls_sock.recv(4096)
    print(f"服务器回复: {data.decode('utf-8')}")

dtls_sock.close()

关键说明

  • 显式使用SSLContext配置DTLS协议类型,替代直接调用ssl.wrap_socket,便于清晰配置证书与验证规则
  • 服务端必须加载证书链才能完成DTLS握手;生产环境客户端需启用证书验证并指定可信CA,不可禁用
  • 客户端调用connect()后会自动触发DTLS握手,握手完成后才能正常收发加密数据
  • dtls库的补丁已经处理了UDP套接字的recvfrom/sendto方法,自动完成加密解密逻辑

内容的提问来源于stack exchange,提问作者Selovanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:23:18