2. OPC UA基础回顾
在学习OPC UA安全认证与证书管理之前,必须先回到协议本身,理解它“为什么需要安全”。OPC UA(Open Platform Communications Unified Architecture)并不是经典OPC的简单升级,而是一次从接口规范到平台架构的重构。它把数据、类型、语义、通信和安全统一封装在一套面向服务的架构中,使工业数据不仅能被读取,还能被理解、被订阅、被方法调用,并在不可信网络中安全传输。
一、核心架构:从地址空间到传输映射
OPC UA的架构可以概括为“一个地址空间、两层角色、多种传输映射”。服务器维护一个统一的地址空间(AddressSpace),其中所有对象、变量、方法、类型都以节点(Node)形式存在,节点之间通过引用(Reference)连接。客户端不直接访问内存地址,而是通过服务(Service)对节点进行浏览、读取、写入、订阅和调用。
在角色上,OPC UA采用客户端/服务器模型,同时支持发布/订阅(PubSub)扩展。服务器端包含地址空间、会话管理、订阅管理、安全通道和传输映射;客户端通过安全通道建立会话,再在会话中发起服务请求。传输层可以映射到TCP、HTTPS、WebSocket,也可以映射到MQTT、AMQP等消息中间件,形成不同的部署形态。
二、信息模型:让数据具备语义
经典OPC依赖Item ID和标签名,语义往往靠工程约定。OPC UA则用信息模型把“数据是什么、属于谁、能做什么”显式表达出来。地址空间中的每个节点都有NodeId、BrowseName、DisplayName、NodeClass和属性;节点之间通过HasComponent、HasProperty、Organizes、HasTypeDefinition等引用建立层次和类型关系。
例如,一台泵可以建模为对象节点,其下包含“温度”“压力”“运行状态”等变量节点,并挂接“启动”“停止”方法节点。客户端浏览时不仅能看到值,还能看到单位、工程范围、数据类型和访问权限。这种模型使OPC UA具备自描述能力,也为后续证书中的ApplicationUri、安全策略匹配提供了语义基础。
三、通信模式与服务集
OPC UA的通信模式主要有三类:请求/响应、订阅/发布和PubSub。请求/响应用于读写、方法调用和浏览;订阅/发布用于周期或变化上报,客户端创建Subscription和MonitoredItem,服务器按采样间隔和死区推送通知;PubSub则面向多对多、低延迟场景,可基于UDP、MQTT或AMQP传输,适合大规模数据分发。
服务集是客户端与服务器交互的“动词表”。安全相关服务集中在SecureChannel和Session服务集中:OpenSecureChannel用于建立安全通道,CreateSession用于创建会话,ActivateSession用于激活并提交用户身份令牌。理解这些服务的顺序,才能理解证书在何时被验证、被使用。
| 服务集 | 典型服务 | 作用 | 与安全的关系 |
|---|---|---|---|
| SecureChannel | OpenSecureChannel、CloseSecureChannel | 建立/关闭安全通道 | 验证服务器证书,协商对称密钥 |
| Session | CreateSession、ActivateSession、CloseSession | 管理会话与用户身份 | 提交用户令牌,绑定安全通道 |
| View | Browse、BrowseNext、TranslateBrowsePathsToNodeIds | 浏览地址空间 | 受会话权限约束 |
| Attribute | Read、Write、HistoryRead | 读写属性与历史数据 | 受访问级别与用户权限控制 |
| Subscription | CreateSubscription、CreateMonitoredItems、Publish | 订阅数据变化 | 通知消息受安全通道保护 |
四、与经典OPC的区别:从COM/DCOM到平台无关
经典OPC(OPC DA、OPC A&E、OPC HDA)建立在Windows COM/DCOM之上,部署受防火墙、域环境和DCOM配置限制,跨平台能力弱,安全主要依赖操作系统账户和DCOM权限。OPC UA则完全独立于平台,采用面向服务的架构,支持TCP、HTTPS、WebSocket和消息中间件,安全机制内建于协议层。
更关键的区别在于:经典OPC的“安全”是外挂的,OPC UA的安全是内生的。OPC UA定义了安全策略、证书、信任列表、用户令牌和审计日志,使客户端与服务器在建立通道时就能完成身份验证和加密协商。这也是本课程后续要重点展开的内容。
核心记忆点:OPC UA = 地址空间(信息模型)+ 服务集(交互能力)+ 安全通道(证书与策略)+ 多种传输映射。安全不是附加项,而是架构的一部分。
五、案例场景:从GetEndpoints到订阅
假设一台SCADA客户端要连接PLC的OPC UA服务器,典型流程如下:
1. 客户端访问 DiscoveryEndpoint,调用 GetEndpoints
2. 服务器返回 EndpointDescription 列表:
- EndpointUrl: opc.tcp://plc01:4840
- SecurityPolicy: Basic256Sha256
- SecurityMode: SignAndEncrypt
- ServerCertificate: 服务器应用实例证书
3. 客户端选择端点,验证服务器证书是否在信任列表
4. 调用 OpenSecureChannel,协商对称密钥
5. 调用 CreateSession,提交客户端证书与Nonce
6. 调用 ActivateSession,提交用户名令牌或X.509身份令牌
7. 调用 CreateSubscription + CreateMonitoredItems
8. 服务器通过 Publish 返回数据变化通知
这个流程中,证书出现在第2、3、4、5步。如果服务器证书不受信任,或客户端证书未被服务器信任,安全通道就无法建立,后续服务全部失败。因此,证书管理不是“配完就行”,而是连接能否成功的前置条件。
六、常见误区与复盘
- 误区一:把OPC UA当成“带加密的OPC DA”。实际上OPC UA的信息模型、服务集和传输映射都完全不同,安全只是其中一层。
- 误区二:只关注用户名密码,忽略证书。在Sign&Encrypt模式下,证书验证失败会在OpenSecureChannel阶段直接中断,根本走不到用户认证。
- 误区三:认为SecurityPolicy=None没有风险。None模式不加密也不签名,任何能访问端口的人都可以读写数据,生产环境应避免。
- 误区四:忽略ApplicationUri和主机名一致性。证书中的ApplicationUri、SubjectAltName必须与端点URL匹配,否则验证会失败。
排障提示:当客户端报“BadSecurityChecksFailed”或“BadCertificateUntrusted”时,优先检查三件事:服务器证书是否在客户端信任列表、客户端证书是否在服务器信任列表、证书中的ApplicationUri与端点URL是否一致。