Esempio n. 1
0
        /// <summary>
        /// Enables SSL/TLS 1.2.
        /// </summary>
        /// <remarks> Registers the <see cref="Session.TlsCertificateValidationCallback"/>
        /// and <see cref="Session.TlsCertificateSelectionCallback"/> with the
        /// SslStream, optionally gets a client side SSL certificate from the local
        /// certificate store, then authenticates the connection. </remarks>
        private void EnableTls()
        {
            RemoteCertificateValidationCallback validationCallback =
                new RemoteCertificateValidationCallback(session.TlsCertificateValidationCallback);

            LocalCertificateSelectionCallback selectionCallback =
                new LocalCertificateSelectionCallback(session.TlsCertificateSelectionCallback);

            SslStream sslStream = new SslStream(
                session.Stream, true, validationCallback, selectionCallback, EncryptionPolicy.RequireEncryption);

            session.Stream = sslStream;

            X509Certificate2 certificate = Session.GetCertificateFromStore(
                string.Format("CN={0}", ServerConfiguration.TlsConfiguration.Certificate));

            X509CertificateCollection certificates = new X509CertificateCollection();

            if (certificate != null)
            {
                certificates.Add(certificate);
            }

            ((SslStream)session.Stream).AuthenticateAsClient(
                ServerConfiguration.Host, certificates, SslProtocols.Tls, ServerConfiguration.TlsConfiguration.CheckCertificateRevocation);
        }
Esempio n. 2
0
        /// <summary> Creates an instance of Server. </summary>
        /// <remarks> All parameters are optional. If null is passed, the object's
        /// configuration is read from the app.config file. If SSL/TLS is enabled, gets
        /// the server-side certificate from the local certificate store.</remarks>
        /// <param name="logger">An optional Logger to log messages. If null is passed,
        /// an attempt is made to read the log4net configuration from the app.config's
        /// file. If the configuration is present, a <see cref="US.OpenServer.Log4NetLogger"/>
        /// is created otherwise a <see cref="US.OpenServer.ConsoleLogger"/> is
        /// created.</param>
        /// <param name="serverConfiguration">An optional ServerConfiguration that contains the
        /// properties necessary to create the server. If null is passed, the
        /// configuration is read from the app.config's 'server' XML section
        /// node.</param>
        /// <param name="protocolConfigurations">An optional Dictionary of
        /// ProtocolConfiguration objects keyed with each protocol's unique identifier.
        /// If null is passed, the configuration is read from the app.config's
        /// 'protocols' XML section node.</param>
        /// <param name="userData">An Object the caller can pass through to each protocol.</param>
        public Server(
            ServerConfiguration serverConfiguration = null,
            Dictionary <ushort, ProtocolConfiguration> protocolConfigurations = null,
            Logger logger   = null,
            object userData = null)
        {
            if (logger == null)
            {
                object log4NetConfiguration = ConfigurationManager.GetSection("log4net");
                if (log4NetConfiguration != null)
                {
                    logger = new Log4NetLogger("DotNetOpenServer");
                }
                else
                {
                    logger = new ConsoleLogger();
                }
            }

            Logger = logger;
            Logger.Log(Level.Info, string.Format("Execution Mode: {0}", Debugger.IsAttached ? "Debug" : "Release"));

            if (serverConfiguration == null)
            {
                serverConfiguration = (ServerConfiguration)ConfigurationManager.GetSection("server");
            }
            if (serverConfiguration == null)
            {
                serverConfiguration = new ServerConfiguration();
            }
            ServerConfiguration = serverConfiguration;

            if (serverConfiguration.TlsConfiguration.Enabled)
            {
                certificate = Session.GetCertificateFromStore(
                    string.Format("CN={0}", ServerConfiguration.TlsConfiguration.Certificate));
                if (certificate == null)
                {
                    throw new Exception(string.Format(
                                            "SSL Certificate '{0}' not found.",
                                            ServerConfiguration.TlsConfiguration.Certificate));
                }
            }

            if (protocolConfigurations == null)
            {
                protocolConfigurations = (Dictionary <ushort, ProtocolConfiguration>)ConfigurationManager.GetSection("protocols");
            }
            if (protocolConfigurations == null)
            {
                protocolConfigurations = new Dictionary <ushort, ProtocolConfiguration>();
            }
            ProtocolConfigurations = protocolConfigurations;

            UserData = userData;

            t = new Thread(new ThreadStart(Run));
            t.Start();
        }