public void TestSslClientConfiguration5() { var location = new IPEndPoint(IPAddress.Loopback, 5055); server = new SslServer(location) { ServerCertificate = SslServer.LoadCertificate( serverCert), AuthenticateClient = true }; server.Start(); TcpClient client = new TcpClient(); try { IXmlDocument xmlDoc = XmlHelper.LoadXml("./Net/Ssl/Configs/config5.xml"); IStreamProvider streamProvider = StreamProviderFactory.CreateProvider(xmlDoc); client.Connect(location); Stream stream = streamProvider.GetStream(client); string echo = SslClient.Echo(stream, "Hello World"); Assert.AreEqual(echo, "Hello World"); } finally { client.Close(); server.Stop(); client = null; } }
public void TestSslConfigurationWithSelector() { IXmlDocument xmlDoc = XmlHelper.LoadXml("./Net/Ssl/Configs/config6.xml"); Assert.NotNull(xmlDoc); IStreamProvider streamProvider = StreamProviderFactory.CreateProvider(xmlDoc); Assert.NotNull(streamProvider); Assert.IsTrue(streamProvider is SslStreamProvider); SslStreamProvider sslStreamProvider = (streamProvider as SslStreamProvider); Assert.IsTrue(sslStreamProvider.LocalCertificateSelector is LocalCertificateSelectionCallback); var location = new IPEndPoint(IPAddress.Loopback, 5055); server = new SslServer(location) { ServerCertificate = SslServer.LoadCertificate(serverCert), AuthenticateClient = true }; server.Start(); TcpClient client = new TcpClient(); try { client.Connect(location); Stream stream = streamProvider.GetStream(client); string echo = SslClient.Echo(stream, "Hello World"); Assert.Fail("Expected Exception, but got none"); } catch (Exception e) { Console.WriteLine("SslTests.TestSslConfigurationWithSelector(), exception: " + e.ToString()); Assert.IsTrue(e is AuthenticationException); Assert.NotNull(e.Message); Assert.IsTrue(e.Message.Contains("RemoteCertificateNameMismatch")); } finally { client.Close(); server.Stop(); client = null; } }
public void TestSslRemoteCertValidation() { IXmlDocument xmlDoc = XmlHelper.LoadXml("./Net/Ssl/Configs/config7.xml"); Assert.NotNull(xmlDoc); IStreamProvider streamProvider = StreamProviderFactory.CreateProvider(xmlDoc); Assert.NotNull(streamProvider); Assert.IsTrue(streamProvider is SslStreamProvider); SslStreamProvider sslStreamProvider = (streamProvider as SslStreamProvider); Assert.IsTrue(sslStreamProvider.RemoteCertificateValidator is RemoteCertificateValidationCallback); var location = new IPEndPoint(IPAddress.Loopback, 5055); server = new SslServer(location) { ServerCertificate = SslServer.LoadCertificate(serverCert), AuthenticateClient = true }; server.Start(); TcpClient client = new TcpClient(); try { client.Connect(location); Stream stream = streamProvider.GetStream(client); Assert.NotNull(stream); Assert.AreEqual(sslStreamProvider.ServerName, "MyServerName"); string echo = SslClient.Echo(stream, "Hello World"); Assert.AreEqual(echo, "Hello World"); } finally { client.Close(); server.Stop(); client = null; } }
/// <summary> /// Configure the controllable service. /// </summary> /// <remarks> /// <p/> /// This method can only be called before the controllable service /// is started. /// </remarks> /// <param name="xml"> /// An <see cref="IXmlElement"/> carrying configuration information /// specific to the IControllable object. /// </param> /// <exception cref="InvalidOperationException"> /// Thrown if the service is already running. /// </exception> /// <exception cref="ArgumentException"> /// Thrown if the configuration information is invalid. /// </exception> public override void Configure(IXmlElement xml) { lock (this) { base.Configure(xml); if (xml == null) { return; } // <tcp-initiator> IXmlElement xmlCat = xml.GetSafeElement("tcp-initiator"); // <stream-provider/> IXmlElement xmlSub = xmlCat.GetSafeElement("stream-provider"); StreamProvider = StreamProviderFactory.CreateProvider(xmlSub); // <local-address> xmlSub = xmlCat.GetSafeElement("local-address"); // <address> // <port> LocalAddress = ParseLocalSocketAddress(xmlSub); // <reusable> IsLocalAddressReusable = xmlSub.GetSafeElement("reusable"). GetBoolean(IsLocalAddressReusable); // <remote-addresses> bool isNameService = false; xmlSub = xmlCat.GetElement("name-service-addresses"); if (xmlSub == null) { xmlSub = xmlCat.GetSafeElement("remote-addresses"); } else { isNameService = true; } IAddressProviderFactory factory; IXmlElement xmlProvider = xmlSub.GetElement("address-provider"); bool missing = xmlProvider == null; bool empty = !missing && xmlProvider.IsEmpty; if (empty || missing) { ConfigurableAddressProviderFactory factoryImpl = new ConfigurableAddressProviderFactory(); factoryImpl.Config = missing ? xmlSub : xmlProvider; factory = factoryImpl; } else { String name = xmlProvider.GetString(); factory = (IAddressProviderFactory) OperationalContext.AddressProviderMap[name]; if (factory == null) { throw new ArgumentException("Address provider " + name + " not found."); } } RemoteAddressProvider = factory.CreateAddressProvider(); if (RemoteAddressProvider is ConfigurableAddressProvider && ConnectTimeout > 0) { ((ConfigurableAddressProvider)RemoteAddressProvider).RequestTimeout = ConnectTimeout; } IsNameService = isNameService; if (isNameService) { Subport = (int)WellKnownSubPorts.NameService; } else { Subport = -1; } // <reuse-address> IsLocalAddressReusable = xmlCat.GetSafeElement("reuse-address"). GetBoolean(IsLocalAddressReusable); // <keep-alive-enabled/> IsKeepAliveEnabled = xmlCat.GetSafeElement("keep-alive-enabled") . GetBoolean(IsKeepAliveEnabled); // <tcp-delay-enabled> IsTcpDelayEnabled = xmlCat.GetSafeElement("tcp-delay-enabled"). GetBoolean(IsTcpDelayEnabled); // <receive-buffer-size> ReceiveBufferSize = ParseMemorySize( xmlCat, "receive-buffer-size", ReceiveBufferSize); // <send-buffer-size> SendBufferSize = ParseMemorySize( xmlCat, "send-buffer-size", SendBufferSize); // <linger-timeout> LingerTimeout = ParseTime( xmlCat, "linger-timeout", LingerTimeout); } }