/// <summary> /// Opens a reverse listener host. /// </summary> public void Open() { // create the UA listener. try { var settings = new TransportListenerSettings { Descriptions = null, Configuration = null, CertificateValidator = null, NamespaceUris = null, Factory = null, ServerCertificate = null, ServerCertificateChain = null, ReverseConnectListener = true }; Utils.LogInfo("Open reverse connect listener for {0}.", Url); m_listener.Open( Url, settings, null ); m_listener.ConnectionWaiting += m_onConnectionWaiting; m_listener.ConnectionStatusChanged += m_onConnectionStatusChanged; } catch (Exception e) { Utils.LogError(e, "Could not open listener for {0}.", Url); throw; } }
/// <summary> /// Create the transport listener for the service host endpoint. /// </summary> /// <param name="endpointUri">The endpoint Uri.</param> /// <param name="endpoints">The description of the endpoints.</param> /// <param name="endpointConfiguration">The configuration of the endpoints.</param> /// <param name="listener">The transport listener.</param> /// <param name="certificateValidator">The certificate validator for the transport.</param> public virtual void CreateServiceHostEndpoint( Uri endpointUri, EndpointDescriptionCollection endpoints, EndpointConfiguration endpointConfiguration, ITransportListener listener, ICertificateValidator certificateValidator ) { // create the stack listener. try { TransportListenerSettings settings = new TransportListenerSettings(); settings.Descriptions = endpoints; settings.Configuration = endpointConfiguration; settings.ServerCertificate = InstanceCertificate; settings.CertificateValidator = certificateValidator; settings.NamespaceUris = MessageContext.NamespaceUris; settings.Factory = MessageContext.Factory; listener.Open( endpointUri, settings, GetEndpointInstance(this)); TransportListeners.Add(listener); listener.ConnectionStatusChanged += OnConnectionStatusChanged; } catch (Exception e) { string message = $"Could not load {endpointUri.Scheme} Stack Listener."; if (e.InnerException != null) { message += (" " + e.InnerException.Message); } Utils.Trace(e, message); throw; } }
/// <summary> /// Create a new service host for UA TCP. /// </summary> protected List<EndpointDescription> CreateUaTcpServiceHost( IDictionary<string, ServiceHost> hosts, ApplicationConfiguration configuration, BindingFactory bindingFactory, IList<string> baseAddresses, ApplicationDescription serverDescription, List<ServerSecurityPolicy> securityPolicies) { // generate a unique host name. string hostName = String.Empty; if (hosts.ContainsKey(hostName)) { hostName = "/Tcp"; } if (hosts.ContainsKey(hostName)) { hostName += Utils.Format("/{0}", hosts.Count); } // check if the server if configured to use the ANSI C stack. bool useAnsiCStack = configuration.UseNativeStack; // build list of uris. List<Uri> uris = new List<Uri>(); EndpointDescriptionCollection endpoints = new EndpointDescriptionCollection(); // create the endpoint configuration to use. EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(configuration); string computerName = System.Net.Dns.GetHostName(); for (int ii = 0; ii < baseAddresses.Count; ii++) { // UA TCP and HTTPS endpoints support multiple policies. if (!baseAddresses[ii].StartsWith(Utils.UriSchemeOpcTcp, StringComparison.Ordinal)) { continue; } UriBuilder uri = new UriBuilder(baseAddresses[ii]); if (String.Compare(uri.Host, "localhost", StringComparison.OrdinalIgnoreCase) == 0) { uri.Host = computerName; } uris.Add(uri.Uri); foreach (ServerSecurityPolicy policy in securityPolicies) { // create the endpoint description. EndpointDescription description = new EndpointDescription(); description.EndpointUrl = uri.ToString(); description.Server = serverDescription; description.SecurityMode = policy.SecurityMode; description.SecurityPolicyUri = policy.SecurityPolicyUri; description.SecurityLevel = policy.SecurityLevel; description.UserIdentityTokens = GetUserTokenPolicies( configuration, description ); description.TransportProfileUri = Profiles.UaTcpTransport; bool requireEncryption = RequireEncryption(description); if (!requireEncryption) { foreach (UserTokenPolicy userTokenPolicy in description.UserIdentityTokens) { if (userTokenPolicy.SecurityPolicyUri != SecurityPolicies.None) { requireEncryption = true; break; } } } if (requireEncryption) { description.ServerCertificate = InstanceCertificate.RawData; //if (InstanceCertificateChain != null) //{ // List<byte> certificateChainList = new List<byte>(); // for (int i = 0; i < InstanceCertificateChain.Count; i++) // { // certificateChainList.AddRange(InstanceCertificateChain[i].RawData); // } // description.ServerCertificate = certificateChainList.ToArray(); //} } endpoints.Add( description ); } // create the UA-TCP stack listener. try { TransportListenerSettings settings = new TransportListenerSettings(); settings.Descriptions = endpoints; settings.Configuration = endpointConfiguration; settings.ServerCertificate = this.InstanceCertificate; //settings.ServerCertificateChain = this.InstanceCertificateChain; settings.CertificateValidator = configuration.CertificateValidator.GetChannelValidator(); settings.NamespaceUris = this.MessageContext.NamespaceUris; settings.Factory = this.MessageContext.Factory; ITransportListener listener = null; Type type = null; if (useAnsiCStack) { type = Type.GetType("Opc.Ua.NativeStack.NativeStackListener,Opc.Ua.NativeStackWrapper"); } if (useAnsiCStack && type != null) { listener = (ITransportListener)Activator.CreateInstance(type); } else { listener = new Opc.Ua.Bindings.UaTcpChannelListener(); } listener.Open( uri.Uri, settings, GetEndpointInstance(this)); TransportListeners.Add(listener); } catch (Exception e) { Utils.Trace(e, "Could not load UA-TCP Stack Listener."); throw; } } return endpoints; }
/// <summary> /// Create a new service host for UA HTTPS. /// </summary> protected List<EndpointDescription> CreateHttpsServiceHost( IDictionary<string, ServiceHost> hosts, ApplicationConfiguration configuration, BindingFactory bindingFactory, IList<string> baseAddresses, ApplicationDescription serverDescription, List<ServerSecurityPolicy> securityPolicies) { // generate a unique host name. string hostName = String.Empty; if (hosts.ContainsKey(hostName)) { hostName = "/Https"; } if (hosts.ContainsKey(hostName)) { hostName += Utils.Format("/{0}", hosts.Count); } // build list of uris. List<Uri> uris = new List<Uri>(); EndpointDescriptionCollection endpoints = new EndpointDescriptionCollection(); // create the endpoint configuration to use. EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(configuration); string computerName = System.Net.Dns.GetHostName(); for (int ii = 0; ii < baseAddresses.Count; ii++) { if (!baseAddresses[ii].StartsWith(Utils.UriSchemeHttps, StringComparison.Ordinal) && !baseAddresses[ii].StartsWith(Utils.UriSchemeNoSecurityHttp, StringComparison.Ordinal)) { continue; } UriBuilder uri = new UriBuilder(baseAddresses[ii]); if (uri.Scheme == Utils.UriSchemeNoSecurityHttp) { uri.Scheme = Utils.UriSchemeHttp; } if (uri.Path[uri.Path.Length-1] != '/') { uri.Path += "/"; } if (String.Compare(uri.Host, "localhost", StringComparison.OrdinalIgnoreCase) == 0) { uri.Host = computerName; } uris.Add(uri.Uri); if (uri.Scheme == Utils.UriSchemeHttps) { // can only support one policy with HTTPS so pick the best one. ServerSecurityPolicy bestPolicy = null; foreach (ServerSecurityPolicy policy in securityPolicies) { if (bestPolicy == null) { bestPolicy = policy; continue; } if (bestPolicy.SecurityLevel > policy.SecurityLevel) { bestPolicy = policy; continue; } } EndpointDescription description = new EndpointDescription(); description.EndpointUrl = uri.ToString(); description.Server = serverDescription; description.ServerCertificate = InstanceCertificate.RawData; //if (InstanceCertificateChain != null) //{ // List<byte> certificateChainList = new List<byte>(); // for (int i = 0; i < InstanceCertificateChain.Count; i++) // { // certificateChainList.AddRange(InstanceCertificateChain[i].RawData); // } // description.ServerCertificate = certificateChainList.ToArray(); //} description.SecurityMode = bestPolicy.SecurityMode; description.SecurityPolicyUri = bestPolicy.SecurityPolicyUri; description.SecurityLevel = bestPolicy.SecurityLevel; description.UserIdentityTokens = GetUserTokenPolicies(configuration, description); description.TransportProfileUri = Profiles.HttpsBinaryTransport; endpoints.Add(description); // create the endpoint description. description = new EndpointDescription(); description.EndpointUrl = uri.ToString(); description.Server = serverDescription; description.ServerCertificate = InstanceCertificate.RawData; //if (InstanceCertificateChain != null) //{ // List<byte> certificateChainList = new List<byte>(); // for (int i = 0; i < InstanceCertificateChain.Count; i++) // { // certificateChainList.AddRange(InstanceCertificateChain[i].RawData); // } // description.ServerCertificate = certificateChainList.ToArray(); //} description.SecurityMode = MessageSecurityMode.None; description.SecurityPolicyUri = SecurityPolicies.None; description.SecurityLevel = 0; description.UserIdentityTokens = GetUserTokenPolicies(configuration, description); description.TransportProfileUri = Profiles.HttpsXmlTransport; endpoints.Add(description); } // create the stack listener. try { TransportListenerSettings settings = new TransportListenerSettings(); settings.Descriptions = endpoints; settings.Configuration = endpointConfiguration; settings.ServerCertificate = this.InstanceCertificate; //settings.ServerCertificateChain = this.InstanceCertificateChain; settings.CertificateValidator = configuration.CertificateValidator.GetChannelValidator(); settings.NamespaceUris = this.MessageContext.NamespaceUris; settings.Factory = this.MessageContext.Factory; ITransportListener listener = new Opc.Ua.Bindings.UaHttpsChannelListener(); listener.Open( uri.Uri, settings, GetEndpointInstance(this)); TransportListeners.Add(listener); } catch (Exception e) { Utils.Trace(e, "Could not load HTTPS Stack Listener."); throw; } } return endpoints; }