4. OPC UA 安全机制:安全策略、证书管理、用户认证、加密传输与签名
OPC UA 协议在设计之初便将安全性作为核心架构要素,而非后期附加的补丁。它通过分层安全模型,解决了工业控制系统中数据机密性、完整性、可用性以及身份验证的挑战。本章节将深入剖析 OPC UA 的安全策略、证书管理体系、用户认证机制以及加密传输与签名技术。
4.1 OPC UA 安全模型概述
OPC UA 安全模型基于“纵深防御”理念,在传输层、应用层和用户层分别实施安全控制。其核心安全组件包括:
- 安全策略(Security Policy):定义通信双方使用的加密算法套件和密钥长度。
- 证书管理(Certificate Management):通过 X.509 数字证书实现应用实例的身份验证。
- 用户认证(User Authentication):验证操作人员的身份,支持用户名/密码、X.509 证书、令牌等多种方式。
- 加密传输与签名(Encryption & Signing):确保数据在传输过程中的机密性和完整性。
4.2 安全策略(Security Policy)
安全策略是 OPC UA 通信双方必须协商一致的第一道关卡。它定义了用于消息签名和加密的对称与非对称算法套件。OPC UA 规范预定义了若干标准安全策略,客户端和服务器必须在建立安全通道时选择双方都支持的策略。
| 安全策略名称 | 对称加密算法 | 对称签名算法 | 非对称密钥长度 | 安全等级 |
|---|---|---|---|---|
| None | 无 | 无 | 无 | 无(明文传输) |
| Basic128Rsa15 | AES-128 | HMAC-SHA1 | RSA 1024/2048 | 低(兼容旧系统) |
| Basic256 | AES-256 | HMAC-SHA1 | RSA 1024/2048 | 中 |
| Basic256Sha256 | AES-256 | HMAC-SHA256 | RSA 2048/4096 | 高(推荐) |
| Aes128_Sha256_RsaOaep | AES-128 | HMAC-SHA256 | RSA-OAEP 2048+ | 高(现代标准) |
| Aes256_Sha256_RsaPss | AES-256 | HMAC-SHA256 | RSA-PSS 2048+ | 最高(推荐) |
4.3 证书管理(Certificate Management)
OPC UA 使用 X.509 v3 数字证书来标识每一个应用实例(客户端、服务器、聚合服务器等)。证书管理是 OPC UA 安全体系中最复杂也最关键的环节,涉及证书的生成、分发、验证、信任和撤销。
4.3.1 证书类型与作用
- 应用实例证书(Application Instance Certificate):每个 OPC UA 应用(如 PLC 服务器、SCADA 客户端)必须拥有唯一的实例证书,用于标识自身身份。
- 证书颁发机构(CA)证书:企业级部署中,建议搭建内部 CA 或使用商业 CA 签发实例证书,便于集中管理。
- 自签名证书:开发测试阶段常用,但生产环境不推荐,因为无法实现自动信任和撤销。
4.3.2 证书信任链与验证流程
当客户端与服务器建立安全通道时,双方会交换各自的实例证书。验证过程如下:
- 证书链构建:接收方根据发送方提供的证书,向上查找签发者证书,直到根 CA 证书。
- 签名验证:使用签发者公钥验证证书的数字签名,确保证书未被篡改。
- 有效期检查:验证证书当前时间是否在有效期内。
- 撤销检查:通过 CRL(证书撤销列表)或 OCSP(在线证书状态协议)检查证书是否已被撤销。
- 信任列表匹配:将证书或根 CA 证书与本地信任列表(Trust List)进行匹配。
4.3.3 证书存储目录结构(PKI 规范)
OPC UA 规范推荐使用标准 PKI 目录结构来管理证书文件。典型的目录布局如下:
PKI/
├── own/ # 本应用实例的私钥和证书
│ ├── private/
│ │ └── private.pem # 私钥文件(权限必须严格限制)
│ └── cert.pem # 本实例证书
├── trusted/ # 信任的证书(直接信任的对端证书)
│ └── peer_cert.der
├── issuers/ # 信任的 CA 证书(用于验证对端证书链)
│ └── ca_cert.der
├── rejected/ # 验证失败的证书(用于审计和调试)
│ └── unknown_cert.der
└── crl/ # 证书撤销列表
└── ca_crl.der
4.4 用户认证(User Authentication)
在应用实例证书验证通过后,OPC UA 还支持在应用层对操作用户进行身份认证。用户认证与证书认证是正交的安全措施,可以组合使用。
| 认证方式 | 描述 | 适用场景 | 安全等级 |
|---|---|---|---|
| Anonymous | 无需用户凭证,仅依赖证书认证 | 只读监控、公共数据采集 | 低 |
| UserName | 用户名 + 密码,密码经过加密传输 | HMI 操作员登录、MES 系统 | 中 |
| X509 Certificate | 用户持有个人证书,通过证书验证身份 | 工程师站、高安全等级维护 | 高 |
| Issued Token | 基于外部身份提供者(如 OAuth2、Kerberos)颁发的令牌 | 企业级 SSO、云平台集成 | 高 |
4.5 加密传输与签名(Encryption & Signing)
OPC UA 在安全通道建立后,对应用层消息进行签名和加密,确保数据的机密性和完整性。这一过程发生在 OPC UA 二进制协议或 HTTPS 传输之上。
4.5.1 消息签名(Signing)
发送方使用对称密钥(通过密钥协商产生)对消息体计算 HMAC(哈希消息认证码),并将签名附加到消息尾部。接收方使用相同的对称密钥重新计算 HMAC 并与接收到的签名比对,以检测消息在传输过程中是否被篡改。
4.5.2 消息加密(Encryption)
发送方使用对称密钥对消息体进行加密(AES 算法)。只有持有相同对称密钥的接收方才能解密。加密过程在签名之后进行,即先签名后加密,确保接收方可以先解密再验证签名。
4.5.3 安全通道建立流程
- Hello 消息:客户端发送支持的 SecurityPolicy 列表。
- 服务器选择:服务器选择一个双方都支持的 SecurityPolicy,并返回自己的实例证书。
- 证书验证:客户端验证服务器证书(链、有效期、撤销、信任)。
- 密钥协商:使用非对称加密(RSA)交换对称密钥材料,生成会话密钥。
- 激活安全通道:后续所有消息均使用对称密钥进行签名和加密。
4.6 安全配置实战示例(基于 open62541)
以下代码片段展示了如何在 open62541 堆栈中配置安全策略和加载证书:
#include <open62541/plugin/log_stdout.h>
#include <open62541/server.h>
#include <open62541/server_config_default.h>
int main(void) {
UA_Server *server = UA_Server_new();
UA_ServerConfig *config = UA_Server_getConfig(server);
// 加载服务器证书和私钥
UA_ByteString certificate = UA_ByteString_fromFile("server_cert.der");
UA_ByteString privateKey = UA_ByteString_fromFile("server_key.der");
// 配置安全策略:Basic256Sha256
config->securityPolicies[0] = UA_SecurityPolicy_Basic256Sha256();
config->securityPolicies[0].policyUri = UA_STRING_ALLOC(
"http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256");
// 设置应用证书
config->applicationDescription.applicationName =
UA_LOCALIZEDTEXT_ALLOC("en-US", "Edge Gateway Server");
config->applicationDescription.applicationUri =
UA_STRING_ALLOC("urn:edge:gateway:server");
config->certificate = certificate;
config->privateKey = privateKey;
// 配置用户认证:用户名-密码模式
UA_UsernamePasswordLogin login = {
.username = UA_STRING_ALLOC("admin"),
.password = UA_STRING_ALLOC("secure_password_123")
};
UA_ServerConfig_addUsernamePasswordLogin(config, login);
// 启动服务器
UA_Server_run(server, &running, NULL);
UA_Server_delete(server);
return 0;
}
4.7 边缘计算环境中的安全挑战与对策
在边缘计算场景下,OPC UA 安全机制面临独特的挑战:
- 资源受限设备:部分边缘网关 CPU 性能有限,建议使用 AES-128 而非 AES-256 以降低计算开销,或启用硬件加密引擎。
- 证书生命周期管理:边缘设备数量庞大,手动更新证书不可行。建议部署 ACME 协议或 OPC UA 的证书自动管理扩展(如 LDS 注册)。
- 离线运行:边缘设备可能间歇性断网,CRL 检查可能失败。可配置为“允许离线信任”,但需配合短期有效证书(如 24 小时)降低风险。
- 安全策略降级攻击:确保服务器拒绝客户端请求使用低于配置最低安全策略的连接,防止中间人强制降级。
| 挑战 | 推荐对策 | 实施优先级 |
|---|---|---|
| 资源受限 | 使用 Aes128_Sha256_RsaOaep 策略 + 硬件加速 | 高 |
| 证书更新 | 部署内部 CA + 自动证书注册(EST/ACME) | 高 |
| 离线验证 | 短期证书 + 本地信任列表白名单 | 中 |
| 策略降级 | 服务器端强制最低安全策略枚举 | 高 |
| 审计日志 | 记录所有证书验证失败和认证失败事件 | 中 |
通过合理配置上述安全机制,OPC UA 能够在边缘计算环境中提供企业级的安全保障,满足 IEC 62443 工业网络安全标准的要求。