跳到主要内容

安全模型 (Security)

OPC UA 的安全模型分两层:

  1. 传输层 — 通道是否签名 / 加密 (MessageSecurityMode)
  2. 身份层 — 用户用什么身份登录 (UserTokenType)

两层独立, 可以"加密通道 + 匿名登录", 也可以"明文通道 + 用户名密码".

配套阅读

MessageSecurityMode

Mode防篡改加密
Invalid0
None1××
Sign2×
SignAndEncrypt3

SecurityPolicy

定义具体加密算法套件:

Policy URI算法状态
#None仅 None 模式
#Basic128Rsa15RSA-1.5 + AES-128 + SHA-1已废弃 (本 SDK 不支持)
#Basic256RSA-OAEP + AES-256 + SHA-1已废弃 (本 SDK 不支持)
#Basic256Sha256RSA-OAEP + AES-256 + SHA-256本 SDK 主用
#Aes128_Sha256_RsaOaepAES-128 + SHA-256 + RSA-OAEP本 SDK 暂不支持
#Aes256_Sha256_RsaPssAES-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说明
Anonymous0匿名
Username1用户名 + 密码
Certificate2X.509 用户证书 (与传输层证书可以是不同的)
Issued3OAuth2 / SAML 等令牌 (本 SDK 暂不实现)

加密通道 + 用户身份的组合

场景MessageSecurityModeUserToken适用
内网开发NoneAnonymous最快, 0 开销
内网生产SignUsername防篡改 + 身份审计
公网生产SignAndEncryptUsername 或 Certificate标准生产配置
高安全SignAndEncryptCertificate双因素 (证书登录 + 加密通道)

握手流程

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.


相关链接