安全模式详解:None、Sign、SignAndEncrypt
好,咱们进入第二章。上一章聊了 OPC UA 安全到底在防什么,这一章咱们直接上手——把三种安全模式掰开揉碎讲清楚。
说白了,安全模式就是客户端和服务器之间,通信时到底穿了几层“防弹衣”。OPC UA 定义了三种:None、Sign、SignAndEncrypt。我刚开始接触时也觉得名字绕,但用多了就发现,其实就三个问题:要不要签名?要不要加密?两个都要还是只要一个?
1. None 模式:裸奔,但有时也得用
None 模式,顾名思义,啥安全措施都没有。数据明文发送,不签名,不加密。你想想看,这不就跟在公网上发明文 HTTP 一样吗?
但别急着否定它。我在项目里见过不少场景,None 模式反而是最合适的选择:
- 内部调试网络:设备在实验室里,跟外网物理隔离,你非要搞签名加密,反而增加调试复杂度。
- 只读监控系统:只采集数据,不写任何控制指令。数据被篡改的后果可以接受,或者有上层校验。
- 性能敏感场景:某些老旧 PLC,CPU 算力有限,跑签名加密能把扫描周期拖长 30%。这时候 None 模式是唯一能跑的选择。
2. Sign 模式:防篡改,但不防偷看
Sign 模式,给每条消息加一个数字签名。接收方收到后,先验签——签名对得上,说明消息是合法发送方发的,中途没被改过。
但注意,消息内容本身还是明文的。也就是说,别人虽然改不了你的数据,但可以偷看。这就像你寄快递,贴了个防拆封条,但快递盒是透明的——谁都能看到里面装了什么。
什么时候用 Sign 模式?我个人习惯是:
- 数据需要保证完整性,但不怕泄露。比如产线上的温度、压力等过程值,被偷看了也没啥机密可言,但被篡改了可能导致误报警。
- 控制指令需要防伪造。比如“启动电机”这种命令,必须确保是合法操作员发的,但命令内容本身不是秘密。
- 性能与安全的折中。签名计算比加密轻量得多,对 CPU 压力小。我测过,同样硬件条件下,Sign 模式比 SignAndEncrypt 快大约 40%。
3. SignAndEncrypt 模式:全副武装
SignAndEncrypt,签名 + 加密,双重保险。先对消息签名,保证完整性;再对整个消息体加密,保证机密性。接收方先解密,再验签。
这是 OPC UA 安全模式的最高等级。说白了,就是你的数据包被装进一个带防拆封条的不透明保险箱里——别人既打不开,也改不了。
哪些场景必须用 SignAndEncrypt?
- 跨网络边界通信:比如从车间层传到企业层,中间经过交换机、路由器,甚至互联网。
- 涉及敏感工艺参数:配方、批次号、质量数据,这些被竞争对手拿到就是损失。
- 合规要求:某些行业标准(如 IEC 62443)明确要求关键数据必须加密传输。
三种模式对比一览
我习惯用一张表来对比,清晰明了:
| 特性 | None | Sign | SignAndEncrypt |
|---|---|---|---|
| 身份验证 | ❌ 无 | ✅ 有 | ✅ 有 |
| 数据完整性 | ❌ 无 | ✅ 有 | ✅ 有 |
| 数据机密性 | ❌ 无 | ❌ 无 | ✅ 有 |
| 防重放攻击 | ❌ 无 | ✅ 有 | ✅ 有 |
| CPU 开销 | 极低 | 中等 | 较高 |
| 典型延迟增加 | ~0ms | ~1-3ms | ~3-8ms |
| 适用网络 | 完全可信 | 半可信 | 不可信/公网 |
安全模式选择决策流程
每次做项目,我都会走一遍这个决策流程。你也试试看:
- 网络是否完全可信?(比如同一机柜内的设备)→ 是 → None
- 数据是否包含敏感信息?(配方、密码、密钥)→ 是 → SignAndEncrypt
- 设备 CPU 是否够用?(算力低于 200MHz 的老设备)→ 否 → Sign
- 合规要求是否强制加密?→ 是 → SignAndEncrypt
- 默认选择→ Sign(性能与安全的最佳平衡)
安全模式与安全策略的关系
这里有个容易混淆的点,我特意拎出来说一下:安全模式 ≠ 安全策略。
安全模式是通信时的行为——要不要签名、要不要加密。而安全策略是一整套规则,包括:
- 使用哪种证书
- 证书有效期多长
- 允许哪些安全模式
- 密钥长度是多少
- 等等
打个比方:安全模式是“锁的类型”——是挂锁还是密码锁;安全策略是“锁的使用规则”——钥匙谁保管、多久换一次密码、锁坏了怎么办。
嗯,这里要注意:OPC UA 服务器可以同时支持多种安全模式,但每个会话只能协商一种。客户端连接时,会从服务器支持的模式列表里,选一个双方都支持的最高安全等级。
SVG:三种安全模式对比图
下面这张图,把三种模式的核心差异可视化出来了。我建议你保存下来,做方案时拿出来对照一下:
避坑指南:我踩过的三个坑
最后,分享几个我亲身踩过的坑,你遇到了能少走弯路:
我曾经以为 None 模式就不走安全通道了,结果发现 OPC UA 的握手流程是一样的,只是不签名不加密。这意味着 None 模式仍然会交换证书——只不过不验证。所以,别以为 None 模式就完全没有证书开销。
严格来说,Sign 模式确实防重放——因为签名里带了时间戳和序列号。但我遇到过一种情况:攻击者在极短时间内(毫秒级)截获并重放消息,服务器还没来得及更新序列号缓存。解决方案是:把序列号窗口设小一点,或者直接上 SignAndEncrypt。
我在一个项目中测试 SignAndEncrypt 模式,平均延迟只增加了 5ms,觉得可以接受。结果上线后发现,某些高并发场景下,延迟抖动到了 50ms。后来一查,是证书私钥操作占用了太多 CPU 时间片。所以,性能测试一定要看 P99 延迟,别只看平均值。