安全模型 (Security)
OPC UA 的安全模型分两层:
- 传输层 — 通道是否签名 / 加密 (
MessageSecurityMode) - 身份层 — 用户用什么身份登录 (
UserTokenType)
两层独立, 可以"加密通道 + 匿名登录", 也可以"明文通道 + 用户名密码".
配套阅读
- 启用加密 — PFX 证书 / SecurityMode 实操
- FAQ — 加密配置 — 互信与常见错误
MessageSecurityMode
| Mode | 值 | 防篡改 | 加密 |
|---|---|---|---|
| Invalid | 0 | — | — |
| None | 1 | × | × |
| Sign | 2 | ✓ | × |
| SignAndEncrypt | 3 | ✓ | ✓ |
SecurityPolicy
定义具体加密算法套件:
| Policy URI | 算法 | 状态 |
|---|---|---|
| #None | — | 仅 None 模式 |
| #Basic128Rsa15 | RSA-1.5 + AES-128 + SHA-1 | 已废弃 (本 SDK 不支持) |
| #Basic256 | RSA-OAEP + AES-256 + SHA-1 | 已废弃 (本 SDK 不支持) |
| #Basic256Sha256 | RSA-OAEP + AES-256 + SHA-256 | 本 SDK 主用 |
| #Aes128_Sha256_RsaOaep | AES-128 + SHA-256 + RSA-OAEP | 本 SDK 暂不支持 |
| #Aes256_Sha256_RsaPss | AES-256 + SHA-256 + RSA-PSS | 本 SDK 暂不支持 |
本 SDK 当前主用 Basic256Sha256, 这是 OPC Foundation 推荐的"现行标准强度". 已废弃的 Basic128Rsa15 / Basic256 不再支持.
证书 (X.509)
OPC UA 用 X.509 证书做端点身份验证:
- 客户端证书 (PFX) — 含私钥, 客户端持有
- 服务端证书 — 服务端持有, 客户端可选验证 (TOFU 或预导入)
- 互信 — 双方需要把对方的公钥加到自己的 trusted/ 目录
证书 SAN (Subject Alternative Name) 必须包含一个 URI 形如 urn:<vendor>:<product>:<instance>, 这个 URI 与 ApplicationUri 必须一致, 否则握手会被拒绝.
UserToken (登录身份)
| Token | 值 | 说明 |
|---|---|---|
| Anonymous | 0 | 匿名 |
| Username | 1 | 用户名 + 密码 |
| Certificate | 2 | X.509 用户证书 (与传输层证书可以是不同的) |
| Issued | 3 | OAuth2 / SAML 等令牌 (本 SDK 暂不实现) |
加密通道 + 用户身份的组合
| 场景 | MessageSecurityMode | UserToken | 适用 |
|---|---|---|---|
| 内网开发 | None | Anonymous | 最快, 0 开销 |
| 内网生产 | Sign | Username | 防篡改 + 身份审计 |
| 公网生产 | SignAndEncrypt | Username 或 Certificate | 标准生产配置 |
| 高安全 | SignAndEncrypt | Certificate | 双因素 (证书登录 + 加密通道) |
握手流程
Client Server
│ ──Hello (Endpoint URL)──────▶│
│ ◀────Acknowledge─────────────│
│ ──OpenSecureChannel(cert)───▶│
│ ◀────channel established─────│
│ ──CreateSession(usercert)───▶│
│ ◀────sessionId───────────────│
│ ──ActivateSession(uToken)───▶│
│ ◀────activated───────────────│
│ ──Read/Write/Browse/...─────▶│
│ ◀────responses───────────────│
任意一步失败都会返回具体 StatusCode (BadCertificateInvalid / BadIdentityTokenRejected / BadUserAccessDenied / ...).
时间戳校验
NTP 是硬性要求
Sign / SignAndEncrypt 模式下, 双方都校验时间戳, 偏差超过 ~10 分钟会被拒绝. 生产环境必须配 NTP.
相关链接
- 启用加密 — PFX 生成 / SecurityMode 选择
- FAQ — 加密配置 — 互信与常见错误
- FAQ — 连接故障排查 — StatusCode 速查
- 必要环境 — 网络 / NTP / 证书