using Opc.Ua; using Opc.Ua.Configuration; using Serilog; using ZB.MOM.WW.OtOpcUa.Client.Shared.Models; namespace ZB.MOM.WW.OtOpcUa.Client.Shared.Adapters; /// /// Production implementation that builds a real OPC UA ApplicationConfiguration. /// internal sealed class DefaultApplicationConfigurationFactory : IApplicationConfigurationFactory { private static readonly ILogger Logger = Log.ForContext(); public async Task CreateAsync(ConnectionSettings settings, CancellationToken ct) { var storePath = settings.CertificateStorePath; var config = new ApplicationConfiguration { ApplicationName = "LmxOpcUaClient", ApplicationUri = "urn:localhost:LmxOpcUaClient", ApplicationType = ApplicationType.Client, SecurityConfiguration = new SecurityConfiguration { ApplicationCertificate = new CertificateIdentifier { StoreType = CertificateStoreType.Directory, StorePath = Path.Combine(storePath, "own") }, TrustedIssuerCertificates = new CertificateTrustList { StoreType = CertificateStoreType.Directory, StorePath = Path.Combine(storePath, "issuer") }, TrustedPeerCertificates = new CertificateTrustList { StoreType = CertificateStoreType.Directory, StorePath = Path.Combine(storePath, "trusted") }, RejectedCertificateStore = new CertificateTrustList { StoreType = CertificateStoreType.Directory, StorePath = Path.Combine(storePath, "rejected") }, AutoAcceptUntrustedCertificates = settings.AutoAcceptCertificates }, ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = settings.SessionTimeoutSeconds * 1000 } }; await config.Validate(ApplicationType.Client); if (settings.AutoAcceptCertificates) config.CertificateValidator.CertificateValidation += (_, e) => e.Accept = true; if (settings.SecurityMode != SecurityMode.None) { var app = new ApplicationInstance { ApplicationName = "LmxOpcUaClient", ApplicationType = ApplicationType.Client, ApplicationConfiguration = config }; await app.CheckApplicationInstanceCertificatesAsync(false, 2048); } Logger.Debug("ApplicationConfiguration created for {EndpointUrl}", settings.EndpointUrl); return config; } }