.NET Core 8 OPC UA客户端连接KepServerEX无安全端点报错排查
解决OPC Foundation客户端连接KepServerEX 6的证书及安全配置问题
针对你遇到的三类连续错误,逐个拆解解决方案:
1. 解决> ArgumentNullException: Value cannot be null. (Parameter 'serverCertificate')
你手动创建EndpointDescription时仅指定了EndpointUrl,缺失服务器证书、安全策略等核心元数据,这是空指针错误的根源。永远不要手动构造EndpointDescription,应通过CoreClientUtils.SelectEndpoint从服务器拉取完整端点信息,该方法会自动查询服务器端点列表并返回匹配配置。
2. 解决> The chosen security policy is not supported by the client to connect to the server
当服务器禁用加密(MessageSecurityMode.None)时,必须同步将SecurityPolicyUri设置为SecurityPolicies.None,否则客户端会尝试使用默认安全策略,与服务器配置不匹配导致报错。
3. 解决> Certificate is not trusted
即使在client.Config.xml中设置AutoAcceptUntrustedCertificates=true,仍可能因配置加载顺序、权限问题导致设置不生效。此时需通过代码强制覆盖证书验证逻辑;另外KepServerEX的自签名证书,除安装到系统受信任存储外,测试环境可直接在代码中跳过验证(生产环境需严格校验)。
完整修正代码
var endpointUrl = "opc.tcp://192.168.21.75:49320"; // 初始化应用实例 ApplicationInstance application = new ApplicationInstance { ApplicationName = "OPC UA Client", ApplicationType = ApplicationType.Client, ConfigSectionName = "client" }; // 加载配置并检查客户端证书有效性 await application.LoadApplicationConfiguration(false); bool appCertValid = await application.CheckApplicationInstanceCertificate(false, 0); if (!appCertValid) { throw new Exception("客户端应用证书无效!"); } // 强制接受所有服务器证书(仅测试环境使用,生产环境需替换为合规验证逻辑) application.ApplicationConfiguration.CertificateValidator.CertificateValidation += (sender, e) => { e.Accept = true; }; // 获取服务器端点信息 EndpointDescription endpointDescription = CoreClientUtils.SelectEndpoint(endpointUrl, false); // 匹配无加密安全配置 endpointDescription.SecurityMode = MessageSecurityMode.None; endpointDescription.SecurityPolicyUri = SecurityPolicies.None; // 创建配置端点 EndpointConfiguration endpointConfig = EndpointConfiguration.Create(application.ApplicationConfiguration); ConfiguredEndpoint configuredEndpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfig); // 设置用户身份凭证 var userIdentity = new UserIdentity("netdot", "12345"); // 创建会话 var session = await Session.Create( application.ApplicationConfiguration, configuredEndpoint, false, application.ApplicationName, 60000, userIdentity, null ); Console.WriteLine("会话创建成功!");
额外配置注意事项
- client.Config.xml 关键配置:确保以下配置正确,且文件已复制到程序输出目录:
<ApplicationConfiguration> <SecurityConfiguration> <AutoAcceptUntrustedCertificates>true</AutoAcceptUntrustedCertificates> <RejectSHA1SignedCertificates>false</RejectSHA1SignedCertificates> <!-- KepServerEX可能使用SHA1签名证书 --> </SecurityConfiguration> </ApplicationConfiguration>
- 证书存储权限:.NET Core客户端证书默认存储在用户目录,需确保程序拥有读写权限;若证书创建失败,可手动指定证书存储路径。
内容的提问来源于stack exchange,提问作者Sergio Teijido
相关产品推荐
相关产品推荐

