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

无预存证书时,如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:45:11