2、OPC UA协议安全基础:协议栈架构、安全模型与通信模式

聊OPC UA安全,不能一上来就谈加密算法。你得先搞清楚它到底长什么样,怎么工作的。我最早接触OPC UA时,也犯过这个错——直接跳到证书配置,结果连握手都失败。后来才明白,不理解协议栈架构和安全模型,你根本不知道问题出在哪一层。

这一节,我们就从底层往上捋一遍。把协议栈、安全模型、通信模式这三个核心概念讲透。

2.1 OPC UA协议栈架构

OPC UA的协议栈,说白了就是一套分层的通信骨架。它不像传统工业协议那样把东西都揉在一起,而是拆成了清晰的层级。我个人习惯把它看成三块:底层传输、中间编码、上层服务。

核心要点:OPC UA协议栈是“传输层无关”的。它可以在TCP、HTTPS、甚至UDP上跑。安全机制在每一层都有嵌入,但最关键的还是在会话层。

下面这张图,是我每次培训都会画的。它把OPC UA协议栈的核心分层和安全边界标了出来。

OPC UA 协议栈架构与安全边界 应用层(Application Layer) 客户端/服务器对象、订阅、方法调用、历史数据 安全层(Security Layer) 身份认证、授权、加密、签名、审计 会话层(Session Layer) 会话建立、安全通道协商、令牌管理 编码层(Encoding Layer) UA Binary、UA XML、UA JSON 序列化/反序列化 传输层(Transport Layer) OPC UA TCP、HTTPS、UDP(PubSub) 安全边界 安全层贯穿会话层 和编码层之间

你看,安全层并不是单独挂在那里的。它横跨了会话层和编码层之间。这意味着什么?意味着你的身份认证、加密、签名,是在会话建立时就协商好的,而不是事后补上去的。

我记得有一次,一个客户在部署OPC UA时,发现客户端连不上服务器。查了半天,发现是传输层用了HTTPS,但安全层配置的是None。嗯,这里要注意:传输层协议和安全策略必须匹配。你用HTTPS,安全策略就不能是None,否则握手阶段就报错。

2.2 安全模型:客户端/服务器

OPC UA的安全模型,核心就是客户端和服务器之间的信任关系。你想想看,一个PLC作为服务器,一个上位机作为客户端,它们之间怎么确认对方是可信的?

答案就是:证书 + 策略。

我的经验:很多工程师把OPC UA安全等同于“配证书”。其实证书只是载体,真正的核心是“安全策略”的协商。证书是身份,策略是行为。两者缺一不可。

OPC UA定义了三种安全模型,我列个表,你一看就明白:

安全模型 认证方式 加密 适用场景
None 无认证 无 测试环境、内部只读网络
Sign 证书签名 无 数据完整性要求高,但性能敏感
SignAndEncrypt 证书签名 AES-256 生产环境、跨网段、互联网

我建议,只要不是纯实验室环境,至少用Sign。为什么?因为None模式下,攻击者可以伪造数据包。我在一个汽车焊装车间见过一次事故——有人把None模式的OPC UA暴露在了办公网,结果一个误操作导致机器人急停。虽然不一定是恶意攻击,但风险太大了。

2.3 安全通信模式

OPC UA的通信模式,不是简单的“发一条收一条”。它有一套完整的握手流程。我把它拆成三步:

  1. 发现阶段:客户端先找服务器,获取服务器支持的端点列表。每个端点都包含安全策略和传输协议信息。
  2. 握手阶段:客户端选择一个端点,发起OpenSecureChannel请求。双方交换证书,协商密钥。
  3. 会话阶段:安全通道建立后,创建会话。后续所有数据都在这个加密通道里传输。

避坑指南:我曾经遇到一个案例,客户端总是握手失败。查日志发现,服务器端点的安全策略列表里,只有Basic256Sha256,但客户端只支持Basic128Rsa15。两边没交集,自然连不上。所以,部署前一定要确认两端的安全策略是匹配的。

这里有一个关键点:安全通道(SecureChannel)和会话(Session)是分开的。安全通道负责传输加密,会话负责应用层状态。通道可以复用,会话可以独立管理。这种设计的好处是,你可以在不中断会话的情况下,重新协商通道密钥。

下面这个流程图,展示了完整的通信建立过程:

OPC UA 安全通信建立流程 客户端 服务器 1. 获取端点列表 GetEndpoints 2. 返回端点列表 端点 + 安全策略 3. 选择端点 匹配安全策略 4. 打开安全通道 OpenSecureChannel 5. 验证证书 签名验证 6. 创建会话 CreateSession

这个流程看起来简单,但实际部署时坑不少。比如,证书过期、证书链不完整、主机名不匹配,都会导致握手失败。我建议你在测试阶段,先用OPC UA的测试客户端(比如UaExpert)走一遍流程,确认所有环节都通了,再集成到正式系统里。

2.4 安全策略与加密套件

OPC UA定义了几种标准安全策略。说白了,就是一组加密算法的组合。我常用的就两种:

  • Basic128Rsa15:对称加密用AES-128,签名用RSA-15。性能好,适合资源受限设备。
  • Basic256Sha256:对称加密用AES-256,签名用RSA-SHA256。安全性更高,适合关键系统。

我的建议:新项目直接上Basic256Sha256。Basic128Rsa15虽然快,但RSA-15的签名算法已经有些年头了。安全这东西,别省那点性能。

嗯,这里还要提一句:安全策略是协商出来的,不是单方面决定的。客户端发起请求时,会带上它支持的所有策略。服务器从中选一个它也能支持的。如果没交集,连接就失败。所以,部署前一定要确认两端的安全策略列表有重叠。