/// <inheritdoc /> protected override void ProcessRecord() { var serverSpec = new RingMasterClient.ServerSpec { Endpoints = SecureTransport.ParseConnectionString(this.ConnectionString), UseSecureConnection = true, MustCheckCertificateRevocation = !this.NoCertificateRevocationCheck.IsPresent, MustCheckCertificateTrustChain = !this.NoTrustChainCheck.IsPresent, CertValidationASubject = this.CertValidationASubject, CertValidationASigningThumbprints = this.CertValidationASigningThumbprints, CertValidationBSubject = this.CertValidationBSubject, CertValidationBSigningThumbprints = this.CertValidationBSigningThumbprints, }; string[] clientCerts = new string[] { this.ClientCertificateThumbprint }; serverSpec.ClientCertificate = SecureTransport.GetCertificatesFromThumbPrintOrFileName(clientCerts)[0]; serverSpec.AcceptedServerCertificates = SecureTransport.GetCertificatesFromThumbPrintOrFileName(this.AcceptedServerCertificateThumbprints); this.WriteObject(serverSpec); }
/// <summary> /// Gets a list of <see cref="X509Certificate"/>s that corresponds to the given thumbprint or file paths. /// </summary> /// <param name="paths">List of thumbprint or file paths</param> /// <returns> A list of <see cref="X509Certificate"/>s that correspond to the given paths</returns> public static X509Certificate[] GetCertificatesFromThumbPrintOrFileName(string[] paths) { return(SecureTransport.GetCertificatesFromThumbPrintOrFileName(paths)); }
/// <summary> /// Defines the entry point of the application. /// </summary> /// <param name="args">Command line arguments</param> public static void Main(string[] args) { Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); if (args == null || args.Length < 1) { Trace.TraceError("USAGE: SecureTransportClientTool.exe <connection string> [<request length>]"); return; } string connectionString = args[0]; int requestLength = 128; int waitTimeoutMs = 30000; if (args.Length > 1) { requestLength = int.Parse(args[1]); } var path = System.Reflection.Assembly.GetExecutingAssembly().Location; var builder = new ConfigurationBuilder().SetBasePath(Path.GetDirectoryName(path)).AddJsonFile("appSettings.json"); var appSettings = builder.Build(); var configuration = new SecureTransport.Configuration(); int maxConcurrentRequests = int.Parse(appSettings["MaxConcurrentRequests"]); configuration.SendBufferSize = int.Parse(appSettings["SendBufferSize"]); configuration.ReceiveBufferSize = int.Parse(appSettings["ReceiveBufferSize"]); configuration.UseSecureConnection = bool.Parse(appSettings["SSL.UseSSL"]); if (configuration.UseSecureConnection) { string[] clientThumbprints = appSettings["SSL.ClientCerts"].Split(new char[] { ';', ',' }); string[] serviceThumbprints = appSettings["SSL.ServerCerts"].Split(new char[] { ';', ',' }); configuration.ClientCertificates = SecureTransport.GetCertificatesFromThumbPrintOrFileName(clientThumbprints); configuration.ServerCertificates = SecureTransport.GetCertificatesFromThumbPrintOrFileName(serviceThumbprints); } Trace.TraceInformation( "Connecting to {0}. Using SSL={1} RequestLength={2} MaxConcurrentRequests={3}, SendBufferSize={4}, ReceiveBufferSize={5}", connectionString, configuration.UseSecureConnection, requestLength, maxConcurrentRequests, configuration.SendBufferSize, configuration.ReceiveBufferSize); var connectionAvailable = new ManualResetEvent(false); IPEndPoint[] endpoints = SecureTransport.ParseConnectionString(connectionString); using (var transport = new SecureTransport(configuration)) { transport.StartClient(endpoints); Console.CancelKeyPress += (sender, eventArgs) => { Trace.TraceInformation("Attempting to close client transport"); transport.Close(); }; IConnection currentConnection = null; transport.OnNewConnection = connection => { currentConnection = connection; connectionAvailable.Set(); }; transport.OnConnectionLost = () => { connectionAvailable.Reset(); }; var random = new Random(); var timer = new Stopwatch(); timer.Start(); long requestsSent = 0; byte[] request = new byte[requestLength]; random.NextBytes(request); var sendSemaphore = new SemaphoreSlim(maxConcurrentRequests, maxConcurrentRequests); while (true) { if (!connectionAvailable.WaitOne(waitTimeoutMs)) { Trace.TraceWarning("Connection is not available. retrying..."); continue; } currentConnection.OnPacketReceived = packet => { }; try { if (!sendSemaphore.Wait(waitTimeoutMs)) { Trace.TraceError("Timedout waiting for send semaphore..."); continue; } currentConnection.SendAsync(request).ContinueWith(_ => sendSemaphore.Release()); } catch (IOException ex) { Trace.TraceError("IO Exception: {0}", ex.Message); } Interlocked.Increment(ref requestsSent); if (timer.ElapsedMilliseconds > 5000) { long rate = (requestsSent * 1000) / timer.ElapsedMilliseconds; int inflightCount = maxConcurrentRequests - sendSemaphore.CurrentCount; Trace.TraceInformation($"Send rate={rate} InFlight={inflightCount}"); requestsSent = 0; timer.Restart(); } } } }
/// <summary> /// Defines the entry point of the application. /// </summary> /// <param name="args">Command line arguments</param> public static void Main(string[] args) { Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); if (args == null || args.Length < 1) { Trace.TraceError("USAGE: SecureTransportServiceTool.exe <port>"); return; } int port = int.Parse(args[0]); var configuration = new SecureTransport.Configuration(); var path = System.Reflection.Assembly.GetExecutingAssembly().Location; var builder = new ConfigurationBuilder().SetBasePath(Path.GetDirectoryName(path)).AddJsonFile("appSettings.json"); IConfiguration appSettings = builder.Build(); int maxConcurrentRequests = int.Parse(appSettings["MaxConcurrentRequests"]); configuration.UseSecureConnection = bool.Parse(appSettings["SSL.UseSSL"]); configuration.SendBufferSize = int.Parse(appSettings["SendBufferSize"]); configuration.ReceiveBufferSize = int.Parse(appSettings["ReceiveBufferSize"]); if (configuration.UseSecureConnection) { string[] clientThumbprints = appSettings["SSL.ClientCerts"].Split(new char[] { ';', ',' }); string[] serviceThumbprints = appSettings["SSL.ServerCerts"].Split(new char[] { ';', ',' }); configuration.ClientCertificates = SecureTransport.GetCertificatesFromThumbPrintOrFileName(clientThumbprints); configuration.ServerCertificates = SecureTransport.GetCertificatesFromThumbPrintOrFileName(serviceThumbprints); } Trace.TraceInformation( "Listening on port {0}. Using SSL={1}, MaxConcurentRequests={2}, SendBufferSize={3}, ReceiveBufferSize={4}", port, configuration.UseSecureConnection, maxConcurrentRequests, configuration.SendBufferSize, configuration.ReceiveBufferSize); using (var transport = new SecureTransport(configuration)) { var timer = Stopwatch.StartNew(); long activeConnections = 0; long packetsReceived = 0; Task serverTask = transport.StartServer(port); Console.CancelKeyPress += (sender, eventArgs) => { Trace.TraceInformation("Attempting to close server transport"); transport.Close(); }; var semaphore = new SemaphoreSlim(maxConcurrentRequests, maxConcurrentRequests); transport.OnNewConnection = connection => { Trace.TraceInformation("Connection Established with {0}", connection.RemoteEndPoint); Interlocked.Increment(ref activeConnections); connection.OnPacketReceived = packet => { semaphore.Wait(); Interlocked.Increment(ref packetsReceived); connection.SendAsync(packet).ContinueWith(_ => semaphore.Release()); }; connection.OnConnectionLost = () => { Trace.TraceInformation("Connection with {0} was lost", connection.RemoteEndPoint); Interlocked.Decrement(ref activeConnections); }; }; while (!serverTask.Wait(5000)) { timer.Stop(); long rate = (long)(packetsReceived * 1000) / timer.ElapsedMilliseconds; int inflightCount = maxConcurrentRequests - semaphore.CurrentCount; Trace.TraceInformation($"ActiveConnections={activeConnections}, RequestRate {rate} InFlight count={inflightCount}"); packetsReceived = 0; timer.Restart(); } } }