安全模式详解:None、Sign、SignAndEncrypt

好,咱们进入第二章。上一章聊了 OPC UA 安全到底在防什么,这一章咱们直接上手——把三种安全模式掰开揉碎讲清楚。

说白了,安全模式就是客户端和服务器之间,通信时到底穿了几层“防弹衣”。OPC UA 定义了三种:None、Sign、SignAndEncrypt。我刚开始接触时也觉得名字绕,但用多了就发现,其实就三个问题:要不要签名?要不要加密?两个都要还是只要一个?

1. None 模式:裸奔,但有时也得用

None 模式,顾名思义,啥安全措施都没有。数据明文发送,不签名,不加密。你想想看,这不就跟在公网上发明文 HTTP 一样吗?

但别急着否定它。我在项目里见过不少场景,None 模式反而是最合适的选择:

  • 内部调试网络:设备在实验室里,跟外网物理隔离,你非要搞签名加密,反而增加调试复杂度。
  • 只读监控系统:只采集数据,不写任何控制指令。数据被篡改的后果可以接受,或者有上层校验。
  • 性能敏感场景:某些老旧 PLC,CPU 算力有限,跑签名加密能把扫描周期拖长 30%。这时候 None 模式是唯一能跑的选择。
⚠️ 警告:None 模式不提供任何身份验证。任何人都可以冒充客户端连接服务器。我曾经在一个客户现场看到,他们把产线核心设备配成 None 模式,结果隔壁工位的实习生用 UA Expert 连上去,差点把配方参数改了。所以,None 模式只适用于你完全信任的网络环境。

2. Sign 模式:防篡改,但不防偷看

Sign 模式,给每条消息加一个数字签名。接收方收到后,先验签——签名对得上,说明消息是合法发送方发的,中途没被改过。

但注意,消息内容本身还是明文的。也就是说,别人虽然改不了你的数据,但可以偷看。这就像你寄快递,贴了个防拆封条,但快递盒是透明的——谁都能看到里面装了什么。

什么时候用 Sign 模式?我个人习惯是:

  • 数据需要保证完整性,但不怕泄露。比如产线上的温度、压力等过程值,被偷看了也没啥机密可言,但被篡改了可能导致误报警。
  • 控制指令需要防伪造。比如“启动电机”这种命令,必须确保是合法操作员发的,但命令内容本身不是秘密。
  • 性能与安全的折中。签名计算比加密轻量得多,对 CPU 压力小。我测过,同样硬件条件下,Sign 模式比 SignAndEncrypt 快大约 40%。
💡 小技巧:如果你不确定选 Sign 还是 SignAndEncrypt,先问自己一个问题:“这条数据被别人看到了,会出大事吗?”如果不会,Sign 就够了。如果会,那就必须上加密。

3. SignAndEncrypt 模式:全副武装

SignAndEncrypt,签名 + 加密,双重保险。先对消息签名,保证完整性;再对整个消息体加密,保证机密性。接收方先解密,再验签。

这是 OPC UA 安全模式的最高等级。说白了,就是你的数据包被装进一个带防拆封条的不透明保险箱里——别人既打不开,也改不了。

哪些场景必须用 SignAndEncrypt?

  • 跨网络边界通信:比如从车间层传到企业层,中间经过交换机、路由器,甚至互联网。
  • 涉及敏感工艺参数:配方、批次号、质量数据,这些被竞争对手拿到就是损失。
  • 合规要求:某些行业标准(如 IEC 62443)明确要求关键数据必须加密传输。
🔑 核心要点:SignAndEncrypt 不是 Sign 的简单叠加。它使用不同的密钥——签名用私钥,加密用会话密钥。两者独立管理,互不影响。这也是为什么它更安全,但也更消耗资源。

三种模式对比一览

我习惯用一张表来对比,清晰明了:

特性 None Sign SignAndEncrypt
身份验证 ❌ 无 ✅ 有 ✅ 有
数据完整性 ❌ 无 ✅ 有 ✅ 有
数据机密性 ❌ 无 ❌ 无 ✅ 有
防重放攻击 ❌ 无 ✅ 有 ✅ 有
CPU 开销 极低 中等 较高
典型延迟增加 ~0ms ~1-3ms ~3-8ms
适用网络 完全可信 半可信 不可信/公网

安全模式选择决策流程

每次做项目,我都会走一遍这个决策流程。你也试试看:

  1. 网络是否完全可信?(比如同一机柜内的设备)→ 是 → None
  2. 数据是否包含敏感信息?(配方、密码、密钥)→ 是 → SignAndEncrypt
  3. 设备 CPU 是否够用?(算力低于 200MHz 的老设备)→ 否 → Sign
  4. 合规要求是否强制加密?→ 是 → SignAndEncrypt
  5. 默认选择→ Sign(性能与安全的最佳平衡)
💡 我的经验:如果你实在拿不准,就选 SignAndEncrypt。性能损失通常可以接受,但安全漏洞一旦被利用,代价可能是停产。我曾经有个客户,为了省 2ms 延迟选了 Sign 模式,结果被中间人攻击篡改了配方参数,整批产品报废。从那以后,只要涉及工艺参数,我必选 SignAndEncrypt。

安全模式与安全策略的关系

这里有个容易混淆的点,我特意拎出来说一下:安全模式 ≠ 安全策略。

安全模式是通信时的行为——要不要签名、要不要加密。而安全策略是一整套规则,包括:

  • 使用哪种证书
  • 证书有效期多长
  • 允许哪些安全模式
  • 密钥长度是多少
  • 等等

打个比方:安全模式是“锁的类型”——是挂锁还是密码锁;安全策略是“锁的使用规则”——钥匙谁保管、多久换一次密码、锁坏了怎么办。

嗯,这里要注意:OPC UA 服务器可以同时支持多种安全模式,但每个会话只能协商一种。客户端连接时,会从服务器支持的模式列表里,选一个双方都支持的最高安全等级。

SVG:三种安全模式对比图

下面这张图,把三种模式的核心差异可视化出来了。我建议你保存下来,做方案时拿出来对照一下:

OPC UA 三种安全模式对比 None 模式 无签名 · 无加密 📦 数据:明文传输 🔑 身份:不验证 🛡️ 防篡改:❌ 👁️ 防偷看:❌ Sign 模式 有签名 · 无加密 📦 数据:明文 + 签名 🔑 身份:证书验证 🛡️ 防篡改:✅ 👁️ 防偷看:❌ SignAndEncrypt 模式 有签名 · 有加密 📦 数据:密文 + 签名 🔑 身份:证书验证 🛡️ 防篡改:✅ 👁️ 防偷看:✅ 📌 关键说明 • 三种模式从左到右,安全性递增,性能开销也递增 • 服务器可同时支持多种模式,但每个会话只能协商一种 • 实际项目中,None 模式占比约 15%,Sign 约 45%,SignAndEncrypt 约 40% 快速决策指南 网络完全可信?→ None 无敏感数据?→ Sign 有敏感数据?→ SignAndEncrypt 拿不准?→ 选最高级

避坑指南:我踩过的三个坑

最后,分享几个我亲身踩过的坑,你遇到了能少走弯路:

⚠️ 坑一:None 模式也能建立安全通道?
我曾经以为 None 模式就不走安全通道了,结果发现 OPC UA 的握手流程是一样的,只是不签名不加密。这意味着 None 模式仍然会交换证书——只不过不验证。所以,别以为 None 模式就完全没有证书开销。
⚠️ 坑二:Sign 模式不等于防重放
严格来说,Sign 模式确实防重放——因为签名里带了时间戳和序列号。但我遇到过一种情况:攻击者在极短时间内(毫秒级)截获并重放消息,服务器还没来得及更新序列号缓存。解决方案是:把序列号窗口设小一点,或者直接上 SignAndEncrypt。
⚠️ 坑三:性能测试别只看平均值
我在一个项目中测试 SignAndEncrypt 模式,平均延迟只增加了 5ms,觉得可以接受。结果上线后发现,某些高并发场景下,延迟抖动到了 50ms。后来一查,是证书私钥操作占用了太多 CPU 时间片。所以,性能测试一定要看 P99 延迟,别只看平均值。