启用加密
生产环境强烈建议走 Sign 或 SignAndEncrypt + Basic256Sha256. 步骤就三件: 生成证书 → 服务端导入信任 → 客户端构造时传 PFX.
配套阅读
- 基础知识 — 安全模型 — 概念
- FAQ — 加密配置 — 常见错误排查
- 必要环境 — 上线前准备
1. 生成客户端证书 (PFX)
- Darra CLI (推荐)
- OpenSSL
# Darra OPCUA Client GUI 自带证书工具
DarraOpcUaClient.exe gen-cert --out client.pfx --pwd 123456 --cn "MyClient"
# 1. 私钥 + 证书
openssl req -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=MyClient/O=Darra/C=CN" \
-addext "subjectAltName=URI:urn:darra:client:my-client,DNS:my-host"
# 2. 打包 PFX
openssl pkcs12 -export -out client.pfx -inkey key.pem -in cert.pem -password pass:123456
SAN URI 是硬性要求
OPC UA 要求证书必须含 subjectAltName 字段, URI 形如 urn:<vendor>:<product>:<instance>.
2. 服务端导入并信任
把 cert.pem (或导出的公钥 .der) 复制到服务端的"受信任客户端证书"目录. 各 Server 路径不同:
- Darra SimulatorServer:
<simulator>/pki/trusted/certs/ - open62541:
<server>/pki/trusted/certs/ - UaExpert: 设置 → Certificates → Trust
3. 客户端构造时传证书
- C#
- Python
- Java
using var ua = new DarraOpcUa(
endpointUrl: "opc.tcp://server:4840",
securityMode: MessageSecurityMode.SignAndEncrypt,
clientCertPath: @"C:\certs\client.pfx",
clientKeyPath: "123456" // PFX 密码
);
ua.Connect();
ua = DarraOpcUa(
"opc.tcp://server:4840",
security_mode=MessageSecurityMode.SIGN_AND_ENCRYPT,
client_cert_path="/etc/darra/client.pfx",
client_key_path="123456")
ua.connect()
var ua = new DarraOpcUa.Builder("opc.tcp://server:4840")
.securityMode(MessageSecurityMode.SIGN_AND_ENCRYPT)
.clientCertPath("/etc/darra/client.pfx")
.clientKeyPath("123456")
.build();
ua.connect();
SecurityMode 选择
| 模式 | 防篡改 | 加密 | 性能开销 | 何时用 |
|---|---|---|---|---|
| None | × | × | 0 | 内网, 开发, 性能敏感 |
| Sign | ✓ | × | 低 (~5%) | 防 MITM, 流量可见无所谓 |
| SignAndEncrypt | ✓ | ✓ | 中 (~15%) | 公网, 工厂内网, 默认推荐 |
SecurityPolicy
当前实现支持两种:
http://opcfoundation.org/UA/SecurityPolicy#None— 仅 None mode 用http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256— Sign 与 SignAndEncrypt 默认
SDK 默认行为
不传 securityPolicyUri 时 SDK 按 securityMode 自动选: None → #None, 其他 → #Basic256Sha256.
UserToken (登录身份)
加密通道与登录身份是两件事:
// 加密 + 用户名密码
using var ua = new DarraOpcUa(
endpointUrl: "opc.tcp://server:4840",
securityMode: MessageSecurityMode.SignAndEncrypt,
username: "operator",
password: "secret",
clientCertPath: @"C:\certs\client.pfx",
clientKeyPath: "123456");
证书互信故障排查
| 错误 | 原因 | 解决 |
|---|---|---|
BadCertificateUntrusted | 服务端没把客户端证书加到 trusted | 把客户端 .der 拷到服务端 trusted/ 目录 |
BadCertificateInvalid | 证书过期 / 未生效 / SAN 缺 URI | 重新生成 (含 subjectAltName URI) |
BadSecurityChecksFailed | 证书指纹与 ApplicationUri 不匹配 | 客户端 ApplicationUri 必须 = 证书 SAN.URI |
BadSecurityModeRejected | 服务端不支持该模式 | 换更弱的模式或检查服务端配置 |
详细排查见 FAQ → 加密配置.