/// <summary>
        /// Call back to override server certificate validation
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="certificate"></param>
        /// <param name="chain"></param>
        /// <param name="sslPolicyErrors"></param>
        /// <returns></returns>
        internal bool ValidateServerCertificate(
            object sender,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            //if user callback is registered then do it
            if (ServerCertificateValidationCallback != null)
            {
                var args = new CertificateValidationEventArgs
                {
                    Certificate     = certificate,
                    Chain           = chain,
                    SslPolicyErrors = sslPolicyErrors
                };



                Delegate[] invocationList = ServerCertificateValidationCallback.GetInvocationList();
                Task[]     handlerTasks   = new Task[invocationList.Length];

                for (int i = 0; i < invocationList.Length; i++)
                {
                    handlerTasks[i] = ((Func <object, CertificateValidationEventArgs, Task>)invocationList[i])(null, args);
                }

                Task.WhenAll(handlerTasks).Wait();

                return(args.IsValid);
            }

            if (sslPolicyErrors == SslPolicyErrors.None)
            {
                return(true);
            }

            //By default
            //do not allow this client to communicate with unauthenticated servers.
            return(false);
        }