Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte.
Traduction
Source
Ce sujet n'a pas encore été évalué - Évaluez ce sujet

SslStream, classe

Fournit un flux utilisé pour la communication client-serveur qui utilise le protocole de sécurité SSL (Secure Socket Layer) pour authentifier le serveur et éventuellement le client.

System.Object
  System.MarshalByRefObject
    System.IO.Stream
      System.Net.Security.AuthenticatedStream
        System.Net.Security.SslStream

Espace de noms :  System.Net.Security
Assembly :  System (dans System.dll)
public class SslStream : AuthenticatedStream

Le type SslStream expose les membres suivants.

  Nom Description
Méthode publique SslStream(Stream) Initialise une nouvelle instance de la classe SslStream à l'aide du Stream spécifié.
Méthode publique SslStream(Stream, Boolean) Initialise une nouvelle instance de la classe SslStream à l'aide du Stream et du comportement de clôture de flux spécifiés.
Méthode publique SslStream(Stream, Boolean, RemoteCertificateValidationCallback) Initialise une nouvelle instance de la classe SslStream en utilisant Stream, le comportement de clôture de flux et le délégué de validation de certificat spécifiés.
Méthode publique SslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback) Initialise une nouvelle instance de la classe SslStream en utilisant Stream, le comportement de clôture de flux, le délégué de validation de certificat et le délégué de sélection de certificat spécifiés.
Méthode publique SslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback, EncryptionPolicy) Initialise une nouvelle instance de la classe SslStream à l'aide du Stream spécifié.
Début
  Nom Description
Propriété publique CanRead Obtient une valeur Boolean qui indique si le flux sous-jacent est accessible en lecture. (Substitue Stream.CanRead.)
Propriété publique CanSeek Obtient une valeur Boolean qui indique si le flux sous-jacent peut faire l'objet d'une recherche. (Substitue Stream.CanSeek.)
Propriété publique CanTimeout Obtient une valeur Boolean qui indique si le flux sous-jacent prend en charge les délais d'attente. (Substitue Stream.CanTimeout.)
Propriété publique CanWrite Obtient une valeur Boolean qui indique si le flux sous-jacent est accessible en écriture. (Substitue Stream.CanWrite.)
Propriété publique CheckCertRevocationStatus Obtient une valeur Boolean qui indique si la liste de révocation de certificats est vérifiée au cours du processus de validation des certificats.
Propriété publique CipherAlgorithm Obtient une valeur qui identifie l'algorithme de chiffrement en bloc utilisé par ce SslStream.
Propriété publique CipherStrength Obtient une valeur qui identifie la puissance de l'algorithme de chiffrement utilisé par ce SslStream.
Propriété publique HashAlgorithm Obtient l'algorithme utilisé pour générer des codes d'authentification de messages (MAC).
Propriété publique HashStrength Obtient une valeur qui identifie la puissance de l'algorithme de hachage utilisé par cette instance.
Propriété protégée InnerStream Obtient le flux utilisé par ce AuthenticatedStream pour envoyer et recevoir des données. (Hérité de AuthenticatedStream.)
Propriété publique IsAuthenticated Obtient une valeur Boolean qui indique si l'authentification a réussi. (Substitue AuthenticatedStream.IsAuthenticated.)
Propriété publique IsEncrypted Obtient une valeur Boolean qui indique si ce SslStream utilise le chiffrement de données. (Substitue AuthenticatedStream.IsEncrypted.)
Propriété publique IsMutuallyAuthenticated Obtient une valeur Boolean qui indique si le serveur et le client ont tous les deux été authentifiés. (Substitue AuthenticatedStream.IsMutuallyAuthenticated.)
Propriété publique IsServer Obtient une valeur Boolean qui indique si le côté local de la connexion utilisée par ce SslStream a été authentifié comme serveur. (Substitue AuthenticatedStream.IsServer.)
Propriété publique IsSigned Obtient une valeur Boolean qui indique si les données envoyées à l'aide de ce flux sont signées. (Substitue AuthenticatedStream.IsSigned.)
Propriété publique KeyExchangeAlgorithm Obtient l'algorithme d'échange de clé utilisé par ce SslStream.
Propriété publique KeyExchangeStrength Obtient une valeur qui identifie la puissance de l'algorithme d'échange de clé utilisé par cette instance.
Propriété publique LeaveInnerStreamOpen Obtient une valeur indiquant si le flux utilisé par ce AuthenticatedStream pour envoyer et recevoir des données a été laissé ouvert. (Hérité de AuthenticatedStream.)
Propriété publique Length Obtient la longueur du flux sous-jacent. (Substitue Stream.Length.)
Propriété publique LocalCertificate Obtient le certificat utilisé pour authentifier le point de terminaison local.
Propriété publique Position Obtient ou définit la position actuelle dans le flux sous-jacent. (Substitue Stream.Position.)
Propriété publique ReadTimeout Obtient ou définit la durée pendant laquelle une opération de lecture reste bloquée en attendant des données. (Substitue Stream.ReadTimeout.)
Propriété publique RemoteCertificate Obtient le certificat utilisé pour authentifier le point de terminaison distant.
Propriété publique SslProtocol Obtient une valeur qui indique le protocole de sécurité utilisé pour authentifier cette connexion.
Propriété publique TransportContext Obtient le TransportContext utilisé pour l'authentification à l'aide de la protection étendue.
Propriété publique WriteTimeout Obtient ou définit la durée pendant laquelle une opération d'écriture reste bloquée en attendant des données. (Substitue Stream.WriteTimeout.)
Début
  Nom Description
Méthode publique AuthenticateAsClient(String) Appelé par les clients pour authentifier le serveur, et éventuellement le client, dans une connexion client-serveur.
Méthode publique AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean) Appelé par les clients pour authentifier le serveur, et éventuellement le client, dans une connexion client-serveur. Le processus d'authentification utilise la collection de certificats spécifiée et le protocole SSL.
Méthode publique AuthenticateAsServer(X509Certificate) Appelé par les serveurs pour authentifier le serveur, et éventuellement le client, dans une connexion client-serveur à l'aide du certificat spécifié.
Méthode publique AuthenticateAsServer(X509Certificate, Boolean, SslProtocols, Boolean) Appelé par les serveurs pour commencer une opération asynchrone pour authentifier le serveur et éventuellement le client à l'aide des certificats spécifiés, de la configuration requise et du protocole de sécurité.
Méthode publique BeginAuthenticateAsClient(String, AsyncCallback, Object) Appelé par les clients pour commencer une opération asynchrone pour authentifier le serveur et, éventuellement, le client.
Méthode publique BeginAuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean, AsyncCallback, Object) Appelé par les clients pour commencer une opération asynchrone pour authentifier le serveur et éventuellement le client à l'aide des certificats spécifiés et du protocole de sécurité.
Méthode publique BeginAuthenticateAsServer(X509Certificate, AsyncCallback, Object) Appelé par les serveurs pour commencer une opération asynchrone d'authentification du client, et éventuellement du serveur, dans une connexion client-serveur.
Méthode publique BeginAuthenticateAsServer(X509Certificate, Boolean, SslProtocols, Boolean, AsyncCallback, Object) Appelé par les serveurs pour commencer une opération asynchrone pour authentifier le serveur et éventuellement le client à l'aide des certificats spécifiés, de la configuration requise et du protocole de sécurité.
Méthode publique BeginRead Commence une opération de lecture asynchrone qui lit des données du flux et les stocke dans le tableau spécifié. (Substitue Stream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object).)
Méthode publique BeginWrite Commence une opération d'écriture asynchrone qui écrit des Bytes de la mémoire tampon spécifiée vers le flux. (Substitue Stream.BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object).)
Méthode publique Close Ferme le flux actuel et libère les ressources (telles que les sockets et les handles de fichiers) associées à celui-ci. (Hérité de Stream.)
Méthode publique CopyTo(Stream) Lit les octets à partir du flux actuel et les écrit dans le flux de destination. (Hérité de Stream.)
Méthode publique CopyTo(Stream, Int32) Lit tous les octets du flux actuel et les écrit dans un flux de destination, à l'aide d'une taille de mémoire tampon spécifiée. (Hérité de Stream.)
Méthode publique CreateObjRef Crée un objet contenant toutes les informations appropriées requises pour générer un proxy permettant de communiquer avec un objet distant. (Hérité de MarshalByRefObject.)
Méthode protégée CreateWaitHandle Obsolète. Alloue un objet WaitHandle. (Hérité de Stream.)
Méthode publique Dispose() Libère toutes les ressources utilisées par Stream. (Hérité de Stream.)
Méthode protégée Dispose(Boolean) Libère les ressources non managées utilisées par SslStream et libère éventuellement les ressources managées. (Substitue AuthenticatedStream.Dispose(Boolean).)
Méthode publique EndAuthenticateAsClient Termine une opération d'authentification du serveur asynchrone en attente, démarrée avec un appel précédent à BeginAuthenticateAsServer.
Méthode publique EndAuthenticateAsServer Termine une opération d'authentification du client asynchrone en attente, démarrée avec un appel précédent à BeginAuthenticateAsClient.
Méthode publique EndRead Termine une opération de lecture asynchrone démarrée avec un appel précédent à BeginRead. (Substitue Stream.EndRead(IAsyncResult).)
Méthode publique EndWrite Termine une opération d'écriture asynchrone démarrée avec un appel précédent à BeginWrite. (Substitue Stream.EndWrite(IAsyncResult).)
Méthode publique Equals(Object) Détermine si l'Object spécifié est égal à l'Object en cours. (Hérité de Object.)
Méthode protégée Finalize Autorise un objet à tenter de libérer des ressources et d'exécuter d'autres opérations de netto***ge avant qu'il ne soit récupéré par l'opération garbage collection. (Hérité de Object.)
Méthode publique Flush Provoque l'écriture des données mises en mémoire tampon sur le périphérique sous-jacent. (Substitue Stream.Flush().)
Méthode publique GetHashCode Sert de fonction de hachage pour un type particulier. (Hérité de Object.)
Méthode publique GetLifetimeService Récupère l'objet de service de durée de vie en cours qui contrôle la stratégie de durée de vie de cette instance. (Hérité de MarshalByRefObject.)
Méthode publique GetType Obtient le Type de l'instance actuelle. (Hérité de Object.)
Méthode publique InitializeLifetimeService Obtient un objet de service de durée de vie pour contrôler la stratégie de durée de vie de cette instance. (Hérité de MarshalByRefObject.)
Méthode protégée MemberwiseClone() Crée une copie superficielle de l'objet Object actif. (Hérité de Object.)
Méthode protégée MemberwiseClone(Boolean) Crée une copie superficielle de l'objet MarshalByRefObject actuel. (Hérité de MarshalByRefObject.)
Méthode protégée ObjectInvariant Infrastructure. Prend en charge un Contract. (Hérité de Stream.)
Méthode publique Read Lit les données de ce flux et les stocke dans le tableau spécifié. (Substitue Stream.Read(Byte[], Int32, Int32).)
Méthode publique ReadByte Lit un octet à partir du flux et avance d'un octet la position au sein du flux, ou retourne -1 s'il se situe à la fin du flux. (Hérité de Stream.)
Méthode publique Seek Infrastructure. Lève NotSupportedException. (Substitue Stream.Seek(Int64, SeekOrigin).)
Méthode publique SetLength Définit la longueur du flux sous-jacent. (Substitue Stream.SetLength(Int64).)
Méthode publique ToString Retourne une chaîne qui représente l'objet actuel. (Hérité de Object.)
Méthode publique Write(Byte[]) Écrit les données spécifiées dans ce flux.
Méthode publique Write(Byte[], Int32, Int32) Écrivez le nombre spécifié de Bytes dans le flux sous-jacent à l'aide de la mémoire tampon et de l'offset spécifiés. (Substitue Stream.Write(Byte[], Int32, Int32).)
Méthode publique WriteByte Écrit un octet à la position actuelle dans le flux actuel et avance d'un octet la position dans flux. (Hérité de Stream.)
Début

Le protocole SSL permet de garantir la confidentialité et de vérifier l'intégrité des messages transmis à l'aide de SslStream. Une connexion SSL, telle que celle fournie par SslStream, doit être utilisée lors du transfert d'informations sensibles entre un client et un serveur. L'utilisation de SslStream permet d'empêcher la lecture et la falsification d'informations en transit sur le réseau.

Une instance de SslStream transmet des données à l'aide d'un flux que vous fournissez lors de la création de SslStream. Lorsque vous fournissez ce flux sous-jacent, vous avez la possibilité de spécifier si la fermeture de SslStream ferme également le flux sous-jacent. Généralement, la classe SslStream est utilisée avec les classes TcpClient et TcpListener. La méthode GetStream fournit un NetworkStream qui peut être utilisé avec la classe SslStream.

Après avoir créé un SslStream, le serveur et éventuellement le client doivent être authentifiés. Le serveur doit fournir un certificat X509 qui établit la preuve de son identité et peut demander que le client fasse de même. L'authentification doit être effectuée avant de transmettre des informations à l'aide d'un SslStream. Les clients initialisent l'authentification à l'aide des méthodes AuthenticateAsClient synchrones qui assurent un blocage jusqu'à ce que l'authentification soit accomplie ou des méthodes BeginAuthenticateAsClient asynchrones qui n'assurent aucun blocage pendant l'exécution de l'authentification. Les serveurs initialisent l'authentification à l'aide de la méthode AuthenticateAsServer synchrone ou de la méthode BeginAuthenticateAsServer asynchrone. Le client et le serveur doivent tous les deux initialiser l'authentification.

L'authentification est contrôlée par le fournisseur du canal SSPI (Security Support Provider). Le client a la possibilité de contrôler la validation du certificat du serveur en désignant un délégué RemoteCertificateValidationCallback lors de la création de SslStream. Le serveur peut également contrôler la validation en fournissant un délégué RemoteCertificateValidationCallback. La méthode référencée par le délégué inclut le certificat du tiers distant et les éventuelles erreurs rencontrées par le SSPI lors de la validation du certificat. Notez que si le serveur désigne un délégué, la méthode du délégué est appelée que le serveur ait demandé l'authentification du client ou non. Si le serveur n'a pas demandé l'authentification du client, la méthode du délégué du serveur reçoit un certificat nul et un tableau vide d'erreurs de certificat.

Si le serveur requiert l'authentification du client, le client doit spécifier un ou plusieurs certificats pour l'authentification. Si le client possède plusieurs certificats, il peut fournir un délégué LocalCertificateSelectionCallback pour sélectionner le certificat approprié pour le serveur. Les certificats du client doivent se trouver dans le magasin de certificats "My" de l'utilisateur actuel. L'authentification du client via des certificats n'est pas prise en charge pour le protocole Ssl2 (version 2 de SSL).

Si l'authentification échoue, vous recevez AuthenticationException, et SslStream n'est plus utilisable. Vous devez fermer cet objet et supprimer toutes les références s'y rapportant afin qu'il puisse être récupéré par le garbage collector.

Lorsque le processus d'authentification, également appelé protocole de transfert SSL, réussit, l'identité du serveur (et éventuellement du client) est établie et SslStream peut être utilisé par le client et le serveur pour échanger des messages. Avant d'envoyer ou de recevoir des informations, le client et le serveur doivent vérifier les services et niveaux de sécurité fournis par SslStream pour déterminer si le protocole, les algorithmes et les forces sélectionnées répondent aux exigences d'intégrité et de confidentialité. Si les paramètres actuels ne sont pas suffisants, le flux doit être fermé. Vous pouvez vérifier les services de sécurité fournis par SslStream à l'aide des propriétés IsEncrypted et IsSigned. Le tableau suivant contient les éléments qui indiquent les paramètres de chiffrement utilisés pour l'authentification, le chiffrement et la signature de données.

Élément

Membres

Protocole de sécurité utilisé pour authentifier le serveur et, éventuellement, le client.

Propriété SslProtocol et énumération SslProtocols associée.

Algorithme d'échange de clé.

Propriété KeyExchangeAlgorithm et énumération ExchangeAlgorithmType associée.

Algorithme d'intégrité des messages.

Propriété HashAlgorithm et énumération HashAlgorithmType associée.

Algorithme de confidentialité des messages.

Propriété CipherAlgorithm et énumération CipherAlgorithmType associée.

Puissance des algorithmes sélectionnés.

Propriétés KeyExchangeStrength, HashStrength et CipherStrength.

Après une authentification réussie, vous pouvez envoyer des données à l'aide de la méthode synchrone Write ou de la méthode asynchrone BeginWrite. Vous pouvez recevoir des données à l'aide de la méthode Read synchrone ou de la méthode BeginRead asynchrone.

Si vous avez indiqué à SslStream que le flux sous-jacent doit être laissé ouvert, vous êtes chargé de fermer ce flux de données lorsque vous avez fini de l'utiliser.

Remarque Remarque

Si l'application qui crée l'objet SslStream s'exécute avec les informations d'identification d'un utilisateur normal, l'application n'est pas en mesure d'accéder aux certificats installés dans le magasin de l'ordinateur local à moins que l'autorisation d'effectuer cette opération n'ait été explicitement donnée à l'utilisateur.

SslStream suppose qu'un délai d'attente avec tout autre IOException, lorsqu'une exception est levée à partir du flux de données interne, seront traités comme fatals par son appelant. La réutilisation d'une instance SslStream à l'issue d'un délai d'attente retourne le garbage. Une application doit utiliser CloseSslStream et lève une exception dans ce cas.

L'exemple de code suivant illustre la création de TcpListener qui utilise la classe SslStream pour communiquer avec des clients.


using System;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Authentication;
using System.Text;
using System.Security.Cryptography.X509Certificates;
using System.IO;

namespace Examples.System.Net
{
    public sealed class SslTcpServer 
    {
        static X509Certificate serverCertificate = null;
        // The certificate parameter specifies the name of the file 
        // containing the machine certificate.
        public static void RunServer(string certificate) 
        {
            serverCertificate = X509Certificate.CreateFromCertFile(certificate);
            // Create a TCP/IP (IPv4) socket and listen for incoming connections.
            TcpListener listener = new TcpListener(IPAddress.Any, 8080);    
            listener.Start();
            while (true) 
            {
                Console.WriteLine("Waiting for a client to connect...");
                // Application blocks while waiting for an incoming connection.
                // Type CNTL-C to terminate the server.
                TcpClient client = listener.AcceptTcpClient();
                ProcessClient(client);
            }
        }
        static void ProcessClient (TcpClient client)
        {
            // A client has connected. Create the 
            // SslStream using the client's network stream.
            SslStream sslStream = new SslStream(
                client.GetStream(), false);
            // Authenticate the server but don't require the client to authenticate.
            try 
            {
                sslStream.AuthenticateAsServer(serverCertificate, 
                    false, SslProtocols.Tls, true);
                // Display the properties and settings for the authenticated stream.
                DisplaySecurityLevel(sslStream);
                DisplaySecurityServices(sslStream);
                DisplayCertificateInformation(sslStream);
                DisplayStreamProperties(sslStream);

                // Set timeouts for the read and write to 5 seconds.
                sslStream.ReadTimeout = 5000;
                sslStream.WriteTimeout = 5000;
                // Read a message from the client.   
                Console.WriteLine("Waiting for client message...");
                string messageData = ReadMessage(sslStream);
                Console.WriteLine("Received: {0}", messageData);

                // Write a message to the client.
                byte[] message = Encoding.UTF8.GetBytes("Hello from the server.<EOF>");
                Console.WriteLine("Sending hello message.");
                sslStream.Write(message);
            }
            catch (AuthenticationException e)
            {
                Console.WriteLine("Exception: {0}", e.Message);
                if (e.InnerException != null)
                {
                    Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
                }
                Console.WriteLine ("Authentication failed - closing the connection.");
                sslStream.Close();
                client.Close();
                return;
            }
            finally
            {
                // The client stream will be closed with the sslStream
                // because we specified this behavior when creating
                // the sslStream.
                sslStream.Close();
                client.Close();
            }
        }
        static string ReadMessage(SslStream sslStream)
        {
            // Read the  message sent by the client.
            // The client signals the end of the message using the
            // "<EOF>" marker.
            byte [] buffer = new byte[2048];
            StringBuilder messageData = new StringBuilder();
            int bytes = -1;
            do
            {
                // Read the client's test message.
                bytes = sslStream.Read(buffer, 0, buffer.Length);

                // Use Decoder class to convert from bytes to UTF8
                // in case a character spans two buffers.
                Decoder decoder = Encoding.UTF8.GetDecoder();
                char[] chars = new char[decoder.GetCharCount(buffer,0,bytes)];
                decoder.GetChars(buffer, 0, bytes, chars,0);
                messageData.Append (chars);
                // Check for EOF or an empty message.
                if (messageData.ToString().IndexOf("<EOF>") != -1)
                {
                    break;
                }
            } while (bytes !=0); 

            return messageData.ToString();
        }
         static void DisplaySecurityLevel(SslStream stream)
         {
            Console.WriteLine("Cipher: {0} strength {1}", stream.CipherAlgorithm, stream.CipherStrength);
            Console.WriteLine("Hash: {0} strength {1}", stream.HashAlgorithm, stream.HashStrength);
            Console.WriteLine("Key exchange: {0} strength {1}", stream.KeyExchangeAlgorithm, stream.KeyExchangeStrength);
            Console.WriteLine("Protocol: {0}", stream.SslProtocol);
         }
         static void DisplaySecurityServices(SslStream stream)
         {
            Console.WriteLine("Is authenticated: {0} as server? {1}", stream.IsAuthenticated, stream.IsServer);
            Console.WriteLine("IsSigned: {0}", stream.IsSigned);
            Console.WriteLine("Is Encrypted: {0}", stream.IsEncrypted);
         }
         static void DisplayStreamProperties(SslStream stream)
         {
            Console.WriteLine("Can read: {0}, write {1}", stream.CanRead, stream.CanWrite);
            Console.WriteLine("Can timeout: {0}", stream.CanTimeout);
         }
        static void DisplayCertificateInformation(SslStream stream)
        {
            Console.WriteLine("Certificate revocation list checked: {0}", stream.CheckCertRevocationStatus);

            X509Certificate localCertificate = stream.LocalCertificate;
            if (stream.LocalCertificate != null)
            {
                Console.WriteLine("Local cert was issued to {0} and is valid from {1} until {2}.",
                    localCertificate.Subject,
                    localCertificate.GetEffectiveDateString(),
                    localCertificate.GetExpirationDateString());
             } else
            {
                Console.WriteLine("Local certificate is null.");
            }
            // Display the properties of the client's certificate.
            X509Certificate remoteCertificate = stream.RemoteCertificate;
            if (stream.RemoteCertificate != null)
            {
            Console.WriteLine("Remote cert was issued to {0} and is valid from {1} until {2}.",
                remoteCertificate.Subject,
                remoteCertificate.GetEffectiveDateString(),
                remoteCertificate.GetExpirationDateString());
            } else
            {
                Console.WriteLine("Remote certificate is null.");
            }
        }
        private static void DisplayUsage()
        { 
            Console.WriteLine("To start the server specify:");
            Console.WriteLine("serverSync certificateFile.cer");
            Environment.Exit(1);
        }
        public static int Main(string[] args)
        {
            string certificate = null;
            if (args == null ||args.Length < 1 )
            {
                DisplayUsage();
            }
            certificate = args[0];
            SslTcpServer.RunServer (certificate);
            return 0;
        } 
    }
}


L'exemple de code suivant illustre la création d'un TcpClient utilisant la classe SslStream pour communiquer avec un serveur.


using System;
using System.Collections;
using System.Net;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Text;
using System.Security.Cryptography.X509Certificates;
using System.IO;

namespace Examples.System.Net
{
    public class SslTcpClient 
    {   
        private static Hashtable certificateErrors = new Hashtable();

        // The following method is invoked by the RemoteCertificateValidationDelegate.
        public static bool ValidateServerCertificate(
              object sender,
              X509Certificate certificate,
              X509Chain chain,
              SslPolicyErrors sslPolicyErrors)
        {
           if (sslPolicyErrors == SslPolicyErrors.None)
                return true;

            Console.WriteLine("Certificate error: {0}", sslPolicyErrors);

            // Do not allow this client to communicate with unauthenticated servers.
            return false;
        }
        public static void RunClient(string machineName, string serverName)  
        {
            // Create a TCP/IP client socket.
            // machineName is the host running the server application.
            TcpClient client = new TcpClient(machineName,443);
            Console.WriteLine("Client connected.");
            // Create an SSL stream that will close the client's stream.
            SslStream sslStream = new SslStream(
                client.GetStream(), 
                false, 
                new RemoteCertificateValidationCallback (ValidateServerCertificate), 
                null
                );
            // The server name must match the name on the server certificate.
            try 
            {
                sslStream.AuthenticateAsClient(serverName);
            } 
            catch (AuthenticationException e)
            {
                Console.WriteLine("Exception: {0}", e.Message);
                if (e.InnerException != null)
                {
                    Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
                }
                Console.WriteLine ("Authentication failed - closing the connection.");
                client.Close();
                return;
            }
            // Encode a test message into a byte array.
            // Signal the end of the message using the "<EOF>".
            byte[] messsage = Encoding.UTF8.GetBytes("Hello from the client.<EOF>");
            // Send hello message to the server. 
            sslStream.Write(messsage);
            sslStream.Flush();
            // Read message from the server.
            string serverMessage = ReadMessage(sslStream);
            Console.WriteLine("Server says: {0}", serverMessage);
            // Close the client connection.
            client.Close();
            Console.WriteLine("Client closed.");
        }
        static string ReadMessage(SslStream sslStream)
        {
            // Read the  message sent by the server.
            // The end of the message is signaled using the
            // "<EOF>" marker.
            byte [] buffer = new byte[2048];
            StringBuilder messageData = new StringBuilder();
            int bytes = -1;
            do
            {
                bytes = sslStream.Read(buffer, 0, buffer.Length);

                // Use Decoder class to convert from bytes to UTF8
                // in case a character spans two buffers.
                Decoder decoder = Encoding.UTF8.GetDecoder();
                char[] chars = new char[decoder.GetCharCount(buffer,0,bytes)];
                decoder.GetChars(buffer, 0, bytes, chars,0);
                messageData.Append (chars);
                // Check for EOF.
                if (messageData.ToString().IndexOf("<EOF>") != -1)
                {
                    break;
                }
            } while (bytes != 0); 

            return messageData.ToString();
        }
        private static void DisplayUsage()
        { 
            Console.WriteLine("To start the client specify:");
            Console.WriteLine("clientSync machineName [serverName]");
            Environment.Exit(1);
        }
        public static int Main(string[] args)
        {
            string serverCertificateName = null;
            string machineName = null;
            if (args == null ||args.Length <1 )
            {
                DisplayUsage();
            }
            // User can specify the machine name and server name.
            // Server name must match the name on the server's certificate. 
            machineName = args[0];
            if (args.Length <2 )
            {
                serverCertificateName = machineName;
            }
            else 
            {
                serverCertificateName = args[1];
            }
            SslTcpClient.RunClient (machineName, serverCertificateName);
            return 0;
        }
    }
}
    


.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
Tous les membres static (Shared en Visual Basic) publics de ce type sont thread-safe. Il n'est pas garanti que les membres d'instance soient thread-safe.
Cela vous a-t-il été utile ?
(1500 caractères restants)
Contenu de la communauté Ajouter
Annotations FAQ