OPC UA Server如何配置证书强制验证与通信加密
针对OPC UA Server证书强制校验与加密配置的操作指引
一、强制仅允许持有有效证书的客户端连接配置
你当前遇到的无证书即可连接的问题,本质是示例服务端默认开放了无安全校验的测试配置,按以下步骤修改即可生效:
- 移除所有无安全策略的端点
打开服务端配置的端点列表,全量删除SecurityPolicy设置为None的端点条目,仅保留配置了合法安全策略的端点。 - 关闭自动信任客户端证书的测试开关
找到服务端配置中的AutoAcceptUntrustedCertificates属性,将值设置为false——示例代码中通常会把这个值设为true,会自动将所有发起连接的客户端证书加入信任列表,完全绕过证书校验。 - 修正证书验证回调逻辑
你已经绑定的CertificateValidation回调不要直接写e.Accept = true(这是示例代码最常见的测试用写法,会放行所有证书),参考以下逻辑实现严格校验:private void CertificateValidator_CertificateValidation(CertificateValidator sender, CertificateValidationEventArgs e) { // 证书存在非信任类之外的错误(过期、签名无效、密钥强度不足、域名不匹配等)直接拒绝 if (e.Error.StatusCode != StatusCodes.BadCertificateUntrusted) { e.Accept = false; return; } // 仅当客户端证书存在于服务端受信任对等证书目录中时才放行 using (var trustedStore = config.TrustedPeerCertificates.OpenStore()) { var matchedCert = trustedStore.FindByThumbprint(e.Certificate.Thumbprint); e.Accept = matchedCert != null; } } - 补充弱证书拦截配置
将配置项RejectSHA1SignedCertificates设为true,MinCertificateKeySize设为2048,自动拦截弱签名算法、短密钥的非法证书。
二、基于证书的通信消息加密配置
OPC UA 原生标准完全支持基于应用证书的信道级消息加密,不需要额外引入第三方组件,按以下步骤配置即可:
- 配置端点安全模式
给所有保留的服务端点设置SecurityMode为MessageSecurityMode.SignAndEncrypt,该模式下会在连接建立阶段通过双方的非对称证书协商对称会话密钥,后续所有业务消息都会经过签名校验+全量加密。如果仅需要签名防篡改可以选Sign模式,但要实现加密必须选SignAndEncrypt。 - 配置安全策略白名单
仅保留符合安全要求的安全策略,推荐优先使用SecurityPolicy.Basic256Sha256,兼容新客户端可以补充SecurityPolicy.Aes256_Sha256_RsaPss,直接移除Basic128Rsa15、Basic256等已被披露存在安全风险的旧策略。 - 校验服务端自身证书有效性
确认你之前调用CheckApplicationInstanceCertificate生成的服务端实例证书,已存储在服务端自有证书目录下,且证书包含ServerAuthentication增强密钥用法标识,否则加密信道协商阶段会直接失败。 - 生效验证
配置完成后重启服务端,用无证书、持有非信任证书的客户端尝试连接会直接返回BadSecurityChecksFailed或BadCertificateUntrusted错误;使用受信任证书的客户端正常连接后,通过抓包工具查看OPC UA通信报文,所有业务数据均为密文,无法直接读取节点信息、数据值等明文内容。
注意:官方OPC UA示例工程的默认配置全部是为了简化本地测试设置的,所有和安全相关的默认项都不符合生产环境要求,上线前必须逐一核对修改。
内容的提问来源于stack exchange,提问作者Thanushka
相关产品推荐
相关产品推荐

