无预存证书时,如何用asyncua以Basic128Rsa15加密签名连接OPC UA服务器
使用asyncua无预存证书建立Basic128Rsa15签名的OPC UA连接
核心解决思路
asyncua客户端默认会校验服务器证书,无预存证书时会连接失败。要解决这个问题,需要完成两项配置:指定客户端自身证书的生成路径,以及设置自动信任服务器证书的验证逻辑。
修改后的可运行代码
import asyncio from asyncua import Client import logging _logger = logging.getLogger(__name__) async def connect_opcua_server(url): client = Client(url=url) # 设置登录凭据 client.set_user("Op") client.set_password("Op") # 指定安全策略为Basic128Rsa15+签名模式 client.set_security_string("Basic128Rsa15,Sign") # 配置客户端证书自动生成路径(不存在会自动创建) client.application_uri = "urn:asyncua-client" # 自定义证书验证逻辑:自动信任所有服务器证书 def auto_trust_cert(certificate, hostname): _logger.info(f"自动信任服务器证书: {certificate.subject}") return True client.set_certificate_validator(auto_trust_cert) try: await client.connect() _logger.info("服务器连接成功") # 这里可添加节点读写等后续操作 await client.disconnect() except Exception: _logger.exception('连接失败') if __name__ == "__main__": # 替换为你的OPC UA服务器地址 asyncio.run(connect_opcua_server("opc.tcp://your-server-ip:port"))
重要说明
- 客户端的证书和私钥会自动生成在默认目录(Linux下是
~/.local/share/opcua/client/,Windows下是C:\Users\<用户名>\AppData\Local\opcua\client\),也可以用client.set_client_certificate()和client.set_client_private_key()手动指定路径 - 上面的
auto_trust_cert函数直接返回True仅用于快速测试,生产环境必须添加证书校验逻辑(比如对比预存的证书指纹),避免安全风险 - 如果需要同时启用加密+签名,将安全字符串修改为
"Basic128Rsa15,SignAndEncrypt"即可
内容的提问来源于stack exchange,提问作者Ahmad Kweika
相关产品推荐
相关产品推荐

