OPC UA客户端连接子设备时证书URI不匹配错误求助
问题原因
错误BadCertificateUriInvalid的核心原因是:客户端发送的ApplicationDescription中的URI与证书内嵌的URI不匹配。
你的证书在subjectAltName字段中明确指定了客户端身份URI为urn:freeopcua:client,但asyncua的Client默认会根据目标服务器URL自动生成ApplicationURI,这就导致和证书里的固定URI不一致,触发了服务器的身份验证拦截。
UA Expert能正常连接,是因为它允许手动配置ApplicationURI,确保和证书内的URI完全对齐,而你的代码缺少了这一关键配置步骤。
解决方法
在创建Client实例后,显式设置客户端的application_uri属性,使其与证书中定义的urn:freeopcua:client完全一致即可。修改后的代码如下:
import asyncio from asyncua import Client async def connect_to_opcua_server(): url = "opc.tcp://192.168.120.200:51310/CogentDataHub/DataAccess" username = "username" password = "password" policy = "Basic256Sha256" mode = "SignAndEncrypt" certificate_path = "certificate.pem" private_key_path = "private_key.pem" # 与证书subjectAltName中一致的客户端URI client_app_uri = "urn:freeopcua:client" # 创建客户端实例 client = Client(url) # 显式设置客户端身份URI,匹配证书内容 client.application_uri = client_app_uri # 配置安全策略 security_string = f"{policy},{mode},{certificate_path},{private_key_path}" await client.set_security_string(security_string) # 设置账号密码 client.set_user(username) client.set_password(password) # 连接服务器 await client.connect() print("connected !\n")
额外说明
- OPC UA的安全机制要求客户端声明的身份必须与证书绑定的身份严格一致,这是防止证书被非法复用的核心验证逻辑。
- 若后续更换证书,需同步更新
client.application_uri的值,确保与新证书subjectAltName中的URI完全匹配。
内容的提问来源于stack exchange,提问作者Zmeyp
相关产品推荐
相关产品推荐

