Soy bastante nuevo en el protocolo OPC UA; Recientemente escribí una interfaz C para conectarme a algunas máquinas usando las bibliotecas de OPCFoundation, y hasta ahora no tuve que lidiar con certificados, ya que todas las máquinas permitían conexiones no seguras.
Ahora que tengo que conectarme a una máquina que usa certificados, ¿cómo debo modificar mi código para simular la acción "confiar en el certificado del servidor" que puedo realizar en el software UAExpert, que advierte sobre el certificado, pero me permite confiar en el certificado desde el máquina (guardándolo en una carpeta local) y continuar con la sesión?
En mi código, tengo "AutoAcceptUntrustedCertificates = true" , pero cuando trato de abrir la sesión obtengo un
Opc.Ua.ServiceResultException "El certificado no es de confianza.\r\nSubjectName: CN=NxOpcUaServer@192.168.1.10 ..."
Gracias por adelantado
using Opc.Ua; using Opc.Ua.Client; using Opc.Ua.Configuration; private static String CallOpcUA(string indirizzoMacchina, string displayNome, string idNodo) { var config = new ApplicationConfiguration() { ApplicationName = "MyApp", ApplicationUri = Utils.Format(@"urn:{0}:MyApp", System.Net.Dns.GetHostName()), ApplicationType = ApplicationType.Client, SecurityConfiguration = new SecurityConfiguration { ApplicationCertificate = new CertificateIdentifier { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault", SubjectName = "MyApp" }, TrustedIssuerCertificates = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Certificate Authorities" }, TrustedPeerCertificates = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Applications" }, RejectedCertificateStore = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\RejectedCertificates" }, AutoAcceptUntrustedCertificates = true }, TransportConfigurations = new TransportConfigurationCollection(), TransportQuotas = new TransportQuotas { OperationTimeout = 15000 }, ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }, TraceConfiguration = new TraceConfiguration() }; config.Validate(ApplicationType.Client).GetAwaiter().GetResult(); if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates) { config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted); }; config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateTimeInvalid); }; } var application = new ApplicationInstance { ApplicationName = "MyApplication", ApplicationType = ApplicationType.Client, ApplicationConfiguration = config }; try { application.CheckApplicationInstanceCertificate(false, 2048).GetAwaiter().GetResult(); } catch (System.IO.FileLoadException e) { } try { identity = new UserIdentity(); var selectedEndpoint = CoreClientUtils.SelectEndpoint(indirizzoMacchina, useSecurity: false); using (var session = Session.Create(config, new ConfiguredEndpoint(null, selectedEndpoint, EndpointConfiguration.Create(config)), false, "", 60000, identity, null).GetAwaiter().GetResult()) { [read value from the node] } } catch (Opc.Ua.ServiceResultException e) { } }Con el punto final seguro de OPC UA, siempre debe proporcionar un certificado de cliente. No puede omitir esto, y el servidor debe tener este certificado en su lista de confianza. De lo contrario, el servidor probablemente rechazará su conexión.
No puedo ver en su código que proporciona su certificado de cliente.
No puede anular esto con un lado del cliente AutoAcceptUntrustedCertificates=true.