2、OPC UA安全核心概念:会话、通道、端点与安全策略
好,咱们今天来啃几个硬骨头。会话、通道、端点、安全策略——这四个词,你翻任何OPC UA文档都会反复看到。但说实话,很多工程师干了三五年,对它们的理解还停留在“知道有这么个东西”的层面。
我个人习惯是,讲概念之前先问一个问题:OPC UA为什么要搞这么复杂? 你想想看,传统的工业协议,比如Modbus TCP,连个加密都没有,数据在网络上裸奔。OPC UA作为新一代标准,要解决的就是这个问题——既要保证数据能传过去,又要保证传得安全。所以它设计了一套层层嵌套的安全模型。
嗯,咱们一个一个来拆解。
2.1 端点(Endpoint)—— 你连接的那个“门”
端点是什么?说白了,就是服务器对外暴露的一个“服务入口”。每个端点都绑定了一个具体的URL,比如 opc.tcp://192.168.1.100:4840。客户端要连服务器,第一步就是选一个端点。
但端点不只是个地址。它身上绑了三样东西:
- 安全策略:用什么算法加密、用什么算法签名
- 传输协议:OPC UA Binary、HTTPS等
- 用户令牌类型:允许用什么方式登录(匿名、用户名密码、证书)
我在项目中遇到过一种情况:现场工程师配置服务器时,只暴露了一个端点,而且安全策略设成了“None”。结果客户端连上来,数据全是明文传输。嗯,这在等保2.0测评里直接就是高风险项。所以我的建议是:生产环境中,永远不要暴露安全策略为None的端点,除非你是在做内部测试。
核心要点:一个OPC UA服务器可以暴露多个端点。每个端点可以有不同的安全策略和认证方式。客户端根据自身能力选择合适的端点进行连接。
2.2 安全策略(SecurityPolicy)—— 加密和签名的“规矩”
安全策略定义了一整套密码学算法的组合。包括:
- 对称加密算法(比如AES)
- 非对称加密算法(比如RSA)
- 签名算法(比如SHA-256)
- 密钥长度
OPC UA规范里预定义了几种安全策略,我列个表给你看:
| 安全策略URI | 对称加密 | 非对称加密 | 签名算法 | 安全级别 |
|---|---|---|---|---|
http://opcfoundation.org/UA/SecurityPolicy#None |
无 | 无 | 无 | 无 |
http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15 |
AES128 | RSA-15 | SHA-1 | 低 |
http://opcfoundation.org/UA/SecurityPolicy#Basic256 |
AES256 | RSA-OAEP | SHA-1 | 中 |
http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256 |
AES256 | RSA-OAEP | SHA-256 | 高 |
http://opcfoundation.org/UA/SecurityPolicy#Aes128_Sha256_RsaOaep |
AES128 | RSA-OAEP | SHA-256 | 高 |
你可能会问:为什么有这么多策略?直接上最强的不行吗?
原因有两个。第一,兼容性。有些老旧的嵌入式设备,CPU算力有限,跑不动AES256。第二,合规性。某些行业标准强制要求使用特定的算法组合。比如电力行业,我记得有些规范就明确要求用Basic256Sha256。
我的经验:新项目直接选 Basic256Sha256 或 Aes128_Sha256_RsaOaep。这两个是目前最主流、安全性也够用的组合。别再用Basic128了,SHA-1已经被证明有碰撞风险。
2.3 通道(Channel)—— 安全连接的“管道”
通道是OPC UA通信的底层载体。它建立在TCP连接之上,但比TCP多做了一件事:握手协商。
客户端和服务器建立通道时,会经历一个握手过程:
- 客户端发送Hello消息,告诉服务器自己支持的安全策略列表
- 服务器选择一个双方都支持的安全策略,回复给客户端
- 双方交换证书(如果安全策略要求的话)
- 验证证书有效性
- 协商对称加密密钥
握手完成后,这条通道就是加密的了。后续所有的OPC UA消息,都通过这条通道传输。你想想看,这就像你和银行之间拉了一条专线,专线本身是加密的,别人偷听也看不懂。
我曾经调试过一个诡异的问题:客户端能连上服务器,但一读写数据就报错。查了半天,发现是通道握手时证书链验证失败了,但客户端配置了“忽略证书错误”,所以连接能建立,但数据传输时校验不通过。嗯,这种问题最坑人,表面上看连上了,实际上通道是不安全的。
注意:通道的生命周期是独立的。一个通道可以承载多个会话,但一个会话只能属于一个通道。通道断开后,其上的所有会话都会失效。
2.4 会话(Session)—— 真正的“用户登录”
通道是底层管道,会话是上层应用。你可以这样理解:
- 通道 = 你打电话时用的电话线路(加密的)
- 会话 = 你在电话里说的内容(你是谁、要干什么)
会话是在通道建立之后,由客户端发起的。它主要做两件事:
- 身份认证:客户端提供用户令牌(用户名密码、X.509证书等),服务器验证身份
- 状态管理:会话维护了客户端的订阅、节点浏览位置等上下文信息
一个通道上可以建立多个会话。比如同一个客户端程序,用不同的用户身份登录,就会创建多个会话。但注意,这些会话共享同一条加密通道。
会话还有一个重要特性:超时机制。如果客户端长时间不发送请求,服务器会自动关闭会话。默认超时时间一般是几分钟到几小时不等,可以配置。
避坑指南:我曾经遇到过现场PLC作为OPC UA客户端,每隔几秒就创建新会话,用完不关闭。结果服务器上的会话资源被耗尽,其他客户端连不上了。所以记住:会话用完后一定要主动关闭,别指望超时机制帮你清理。
2.5 四者的关系——一张图说清楚
咱们用个类比来总结:
- 端点 = 公司的大门,每个门有不同的安保等级
- 安全策略 = 门禁系统的加密规则,比如用指纹还是刷卡
- 通道 = 你走进大门后,走的那条专用走廊,走廊里装了监控和加密通话设备
- 会话 = 你在走廊尽头的办公室里,出示工牌,开始办业务
整个流程是:客户端先选一个端点 → 根据端点的安全策略建立通道 → 在通道上创建会话 → 通过会话读写数据。
嗯,这四个概念搞清楚了,OPC UA安全模型你就掌握了七成。剩下的三成,是证书管理、审计日志这些实操层面的东西,咱们后面章节再聊。
一句话记住:端点定规矩,通道保传输,会话管身份。三者缺一不可。