Partager via


SslStream Classe

Définition

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.

public ref class SslStream : System::Net::Security::AuthenticatedStream
public class SslStream : System.Net.Security.AuthenticatedStream
type SslStream = class
    inherit AuthenticatedStream
Public Class SslStream
Inherits AuthenticatedStream
Héritage
Héritage

Exemples

L’exemple de code suivant illustre la création d’une TcpListener classe qui utilise la SslStream classe pour communiquer avec les 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, 5000);
            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, clientCertificateRequired: false, checkCertificateRevocation: 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);
            Console.WriteLine("Is mutually authenticated: {0}", stream.IsMutuallyAuthenticated);
         }
         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;
        }
    }
}
Imports System.Collections
Imports System.Net
Imports System.Net.Sockets
Imports System.Net.Security
Imports System.Security.Authentication
Imports System.Text
Imports System.Security.Cryptography.X509Certificates
Imports System.IO

Namespace Examples.System.Net
    Public NotInheritable Class SslTcpServer
        Shared serverCertificate As X509Certificate = Nothing

        ' The certificate parameter specifies the name of the file 
        ' containing the machine certificate.
        Public Shared Sub RunServer(certificate As String)
            serverCertificate = X509Certificate.CreateFromCertFile(certificate)
            ' Create a TCP/IP (IPv4) socket And listen for incoming connections.
            Dim listener = New TcpListener(IPAddress.Any, 5000)
            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.
                Dim client As TcpClient = listener.AcceptTcpClient()
                ProcessClient(client)
            End While
        End Sub
        Private Shared Sub ProcessClient(client As TcpClient)
            ' A client has connected. Create the 
            ' SslStream using the client's network stream.
            Dim sslStream = New SslStream(client.GetStream(), False)

            Try

                sslStream.AuthenticateAsServer(serverCertificate, clientCertificateRequired:=False, checkCertificateRevocation:=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...")
                Dim messageData As String = ReadMessage(sslStream)
                Console.WriteLine("Received: {0}", messageData)

                ' Write a message to the client.
                Dim message As Byte() = Encoding.UTF8.GetBytes("Hello from the server.<EOF>")
                Console.WriteLine("Sending hello message.")
                sslStream.Write(message)
            Catch e As AuthenticationException
                Console.WriteLine("Exception: {0}", e.Message)

                If e.InnerException IsNot Nothing Then
                    Console.WriteLine("Inner exception: {0}", e.InnerException.Message)
                End If

                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()
            End Try
        End Sub

        Private Shared Function ReadMessage(sslStream As SslStream) As String

            ' Read the  message sent by the client.
            ' The client signals the end of the message using the
            ' "<EOF>" marker.
            Dim buffer As Byte() = New Byte(2048) {}
            Dim messageData As StringBuilder = New StringBuilder()
            Dim bytes As Integer = -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.
                Dim decoder As Decoder = Encoding.UTF8.GetDecoder()
                Dim chars As Char() = New Char(decoder.GetCharCount(buffer, 0, bytes) - 1) {}
                decoder.GetChars(buffer, 0, bytes, chars, 0)
                messageData.Append(chars)

                ' Check for EOF or an empty message.
                If messageData.ToString().IndexOf("<EOF>") <> -1 Then
                    Exit Do
                End If
            Loop While bytes <> 0

            Return messageData.ToString()
        End Function

        Private Shared Sub DisplaySecurityLevel(stream As SslStream)
            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)
        End Sub

        Private Shared Sub DisplaySecurityServices(stream As SslStream)
            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)
            Console.WriteLine("Is mutually authenticated: {0}", stream.IsMutuallyAuthenticated)
        End Sub

        Private Shared Sub DisplayStreamProperties(stream As SslStream)
            Console.WriteLine("Can read: {0}, write {1}", stream.CanRead, stream.CanWrite)
            Console.WriteLine("Can timeout: {0}", stream.CanTimeout)
        End Sub

        Private Shared Sub DisplayCertificateInformation(stream As SslStream)
            Console.WriteLine("Certificate revocation list checked: {0}", stream.CheckCertRevocationStatus)
            Dim localCertificate As X509Certificate = stream.LocalCertificate

            If stream.LocalCertificate IsNot Nothing Then
                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.")
            End If

            ' Display the properties of the client's certificate.
            Dim remoteCertificate As X509Certificate = stream.RemoteCertificate

            If stream.RemoteCertificate IsNot Nothing Then
                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.")
            End If
        End Sub

        Private Shared Sub DisplayUsage()
            Console.WriteLine("To start the server specify:")
            Console.WriteLine("serverSync certificateFile.cer")
            Environment.[Exit](1)
        End Sub

        Public Shared Function Main(ByVal args As String()) As Integer
            Dim certificate As String

            If args Is Nothing OrElse args.Length < 1 Then
                DisplayUsage()
            End If

            certificate = args(0)
            RunServer(certificate)
            Return 0
        End Function
    End Class
End Namespace

L’exemple de code suivant illustre la création d’une TcpClient classe qui utilise la SslStream classe 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,5000);
            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;
        }
    }
}
Imports System.Collections
Imports System.Net
Imports System.Net.Security
Imports System.Net.Sockets
Imports System.Security.Authentication
Imports System.Text
Imports System.Security.Cryptography.X509Certificates
Imports System.IO

Namespace Examples.System.Net

    Public Class SslTcpClient
        
        ' The following method is invoked by the RemoteCertificateValidationDelegate.
        Public Shared Function ValidateServerCertificate(
            sender As Object, 
            certificate As X509Certificate, 
            chain As X509Chain, 
            sslPolicyErrors As SslPolicyErrors) As Boolean
            
            If sslPolicyErrors = SslPolicyErrors.None Then Return True

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

            ' Do not allow this client to communicate with unauthenticated servers.
            Return False
        End Function
        Public Shared Sub RunClient(machineName As String, serverName As String)

            ' Create a TCP/IP client socket.
            ' machineName is the host running the server application.
            Dim client = New TcpClient(machineName, 5000)
            Console.WriteLine("Client connected.")

            ' Create an SSL stream that will close the client's stream.
            Dim sslStream = New SslStream(
                client.GetStream(), False, 
                New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate), Nothing)

            ' The server name must match the name on the server certificate.
            Try
                sslStream.AuthenticateAsClient(serverName)
            Catch e As AuthenticationException
                Console.WriteLine("Exception: {0}", e.Message)

                If e.InnerException IsNot Nothing Then
                    Console.WriteLine("Inner exception: {0}", e.InnerException.Message)
                End If

                Console.WriteLine("Authentication failed - closing the connection.")
                client.Close()
                Return
            End Try
            
            ' Encode a test message into a byte array.
            ' Signal the end of the message using the "<EOF>".
            Dim messsage As Byte() = Encoding.UTF8.GetBytes("Hello from the client.<EOF>")
            
            ' Send hello message to the server.
            sslStream.Write(messsage)
            sslStream.Flush()
            ' Read message from the server.
            Dim serverMessage = ReadMessage(sslStream)
            Console.WriteLine("Server says: {0}", serverMessage)

            ' Close the client connection
            client.Close()
            Console.WriteLine("Client closed.")
        End Sub
        
        Private Shared Function ReadMessage(sslStream As SslStream) As String

            ' Read the  message sent by the server.
            ' The end of the message is signaled using the "<EOF>" marker.
            Dim buffer = New Byte(2048) {}
            Dim messageData = New StringBuilder()
            Dim bytes As Integer

            Do
                bytes = sslStream.Read(buffer, 0, buffer.Length)

                ' Use Decoder class to convert from bytes to UTF8
                ' in case a character spans two buffers.        
                Dim decoder As Decoder = Encoding.UTF8.GetDecoder()
                Dim chars = New Char(decoder.GetCharCount(buffer, 0, bytes) - 1) {}
                decoder.GetChars(buffer, 0, bytes, chars, 0)
                messageData.Append(chars)

                ' Check for EOF.
                If messageData.ToString().IndexOf("<EOF>") <> -1 Then Exit Do
                
            Loop While bytes <> 0

            Return messageData.ToString()

        End Function

        Private Shared Sub DisplayUsage()

            Console.WriteLine("To start the client specify:")
            Console.WriteLine("clientSync machineName [serverName]")
            Environment.[Exit](1)

        End Sub

        Public Shared Function Main(args As String()) As Integer

            Dim serverCertificateName As String
            Dim machineName As String

            If args Is Nothing OrElse args.Length < 1 Then
                DisplayUsage()
            End If

            ' 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 Then
                serverCertificateName = machineName
            Else
                serverCertificateName = args(1)
            End If

            SslTcpClient.RunClient(machineName, serverCertificateName)

            Return 0

        End Function

    End Class

End Namespace

Remarques

Les protocoles SSL aident à assurer la confidentialité et la vérification de l’intégrité des messages transmis à l’aide d’un SslStream. Une connexion SSL, telle que celle fournie par SslStream, doit être utilisée lors de la communication d’informations sensibles entre un client et un serveur. L’utilisation d’une SslStream aide permet d’empêcher toute personne de lire et de falsifier les informations pendant qu’elle est en transit sur le réseau.

Une SslStream instance transmet des données à l’aide d’un flux que vous fournissez lors de la création du SslStreamfichier . Lorsque vous fournissez ce flux sous-jacent, vous avez la possibilité de spécifier si la fermeture SslStream du flux sous-jacent ferme également le flux sous-jacent. En règle générale, la SslStream classe est utilisée avec les classes et TcpListener les TcpClient classes. La GetStream méthode fournit un NetworkStream bon usage avec la SslStream classe.

Après avoir créé un SslStreamserveur, et éventuellement, le client doit être authentifié. Le serveur doit fournir un certificat X509 qui établit la preuve de son identité et peut demander que le client le fasse également. L’authentification doit être effectuée avant de transmettre des informations à l’aide d’un SslStream. Les clients lancent l’authentification à l’aide des méthodes synchrones AuthenticateAsClient , qui bloquent jusqu’à ce que l’authentification se termine, ou les méthodes asynchrones BeginAuthenticateAsClient , qui ne bloquent pas l’attente de l’authentification. Les serveurs lancent l’authentification à l’aide des méthodes synchrones AuthenticateAsServer ou asynchrones BeginAuthenticateAsServer . Le client et le serveur doivent lancer l’authentification.

L’authentification est gérée par le fournisseur de canal SSPI (Security Support Provider). Le client a la possibilité de contrôler la validation du certificat du serveur en spécifiant un RemoteCertificateValidationCallback délégué lors de la création d’un SslStream. Le serveur peut également contrôler la validation en fournissant un RemoteCertificateValidationCallback délégué. La méthode référencée par le délégué inclut le certificat du tiers distant et toutes les erreurs rencontrées par SSPI lors de la validation du certificat. Notez que si le serveur spécifie un délégué, la méthode du délégué est appelée, que le serveur ait demandé l’authentification du client. Si le serveur n’a pas demandé l’authentification du client, la méthode déléguée du serveur reçoit un certificat Null 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 a plusieurs certificats, le client peut fournir un LocalCertificateSelectionCallback délégué 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 Ssl2 protocole (SSL version 2).

En cas d’échec de l’authentification, vous recevez un AuthenticationExceptionmessage et l’authentification SslStream n’est plus utilisable. Vous devez fermer cet objet et supprimer toutes les références à cet objet afin qu’il puisse être collecté par le garbage collector.

Lorsque le processus d’authentification, également appelé négociation SSL, réussit, l’identité du serveur (et éventuellement, le client) est établie et le SslStream client 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 le SslStream protocole, les algorithmes et les forces sélectionnés répondent à leurs exigences en matière 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 à l’aide des SslStream propriétés et IsSigned des IsEncrypted propriétés. Le tableau suivant présente les éléments qui signalent 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 associée SslProtocols .
Algorithme d’échange de clés. Propriété KeyExchangeAlgorithm et énumération associée ExchangeAlgorithmType .
Algorithme d’intégrité des messages. Propriété HashAlgorithm et énumération associée HashAlgorithmType .
Algorithme de confidentialité des messages. Propriété CipherAlgorithm et énumération associée CipherAlgorithmType .
Points forts des algorithmes sélectionnés. Les propriétés et CipherStrength les KeyExchangeStrengthHashStrengthpropriétés.

Après une authentification réussie, vous pouvez envoyer des données à l’aide des méthodes synchrones Write ou asynchrones BeginWrite . Vous pouvez recevoir des données à l’aide des méthodes synchrones Read ou asynchrones BeginRead .

Si vous avez spécifié SslStream que le flux sous-jacent doit être ouvert, vous êtes responsable de la fermeture de ce flux lorsque vous avez terminé de l’utiliser.

Note

Si l’application qui crée l’objet SslStream s’exécute avec les informations d’identification d’un utilisateur normal, l’application ne pourra pas accéder aux certificats installés dans le magasin d’ordinateurs local, sauf si l’autorisation a été explicitement accordée à l’utilisateur.

SslStream suppose qu’un délai d’expiration ainsi qu’un autre IOException lorsqu’un utilisateur est jeté du flux intérieur sera traité comme fatal par son appelant. La réutilisation d’une SslStream instance après un délai d’expiration retourne le garbage. Une application doit Close lever SslStream une exception dans ces cas.

.NET Framework 4.6 inclut une fonctionnalité de sécurité qui bloque les algorithmes de chiffrement et de hachage non sécurisés pour les connexions. Les applications utilisant TLS/SSL via des API telles que HttpClient, HttpWebRequest, FTPClient, SmtpClient et SslStream et ciblant .NET Framework 4.6 obtiennent par défaut le comportement plus sécurisé.

Les développeurs peuvent refuser ce comportement afin de maintenir l’interopérabilité avec leurs services SSL3 existants OU TLS w/ RC4. Cet article explique comment modifier votre code afin que le nouveau comportement soit désactivé.

.NET Framework 4.7 ajoute de nouvelles surcharges pour les méthodes qui authentifient SslStreams qui ne spécifient pas de version TLS, mais utilisent plutôt la version TLS définie comme valeur par défaut du système dans SCHANNEL. Utilisez ces méthodes dans votre application pour pouvoir modifier ultérieurement les valeurs par défaut en tant que meilleures pratiques de version TLS au fil du temps, sans avoir à reconstruire et redéployer votre application.

Consultez également les meilleures pratiques tls (Transport Layer Security) avec .NET Framework.

Constructeurs

Nom Description
SslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback, EncryptionPolicy)

Initialise une nouvelle instance de la SslStream classe à l’aide du .Stream

SslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback)

Initialise une nouvelle instance de la SslStream classe à l’aide du comportement de fermeture de flux spécifié Stream, du délégué de validation de certificat et du délégué de sélection de certificat.

SslStream(Stream, Boolean, RemoteCertificateValidationCallback)

Initialise une nouvelle instance de la SslStream classe à l’aide du comportement de fermeture de flux et du délégué de validation de certificat spécifiés Stream.

SslStream(Stream, Boolean)

Initialise une nouvelle instance de la SslStream classe à l’aide du comportement de fermeture de flux et spécifié Stream .

SslStream(Stream)

Initialise une nouvelle instance de la SslStream classe à l’aide du .Stream

Propriétés

Nom Description
CanRead

Obtient une Boolean valeur qui indique si le flux sous-jacent est lisible.

CanSeek

Obtient une Boolean valeur qui indique si le flux sous-jacent peut être recherché.

CanTimeout

Obtient une Boolean valeur qui indique si le flux sous-jacent prend en charge les délais d’attente.

CanWrite

Obtient une Boolean valeur qui indique si le flux sous-jacent est accessible en écriture.

CheckCertRevocationStatus

Obtient une Boolean valeur qui indique si la liste de révocation de certificats est vérifiée pendant le processus de validation de certificat.

CipherAlgorithm
Obsolète.

Obtient une valeur qui identifie l’algorithme de chiffrement en bloc utilisé par ce SslStreamparamètre .

CipherStrength
Obsolète.

Obtient une valeur qui identifie la force de l’algorithme de chiffrement utilisé par ce SslStream.

HashAlgorithm
Obsolète.

Obtient l’algorithme utilisé pour générer des codes d’authentification de message (MAC).

HashStrength
Obsolète.

Obtient une valeur qui identifie la force de l’algorithme de hachage utilisé par cette instance.

InnerStream

Obtient le flux utilisé par celui-ci AuthenticatedStream pour l’envoi et la réception de données.

(Hérité de AuthenticatedStream)
IsAuthenticated

Obtient une Boolean valeur qui indique si l’authentification a réussi.

IsEncrypted

Obtient une Boolean valeur qui indique si cela SslStream utilise le chiffrement des données.

IsMutuallyAuthenticated

Obtient une Boolean valeur qui indique si le serveur et le client ont été authentifiés.

IsServer

Obtient une Boolean valeur qui indique si le côté local de la connexion utilisée par cette SslStream connexion a été authentifié en tant que serveur.

IsSigned

Obtient une Boolean valeur qui indique si les données envoyées à l’aide de ce flux sont signées.

KeyExchangeAlgorithm
Obsolète.

Obtient l’algorithme d’échange de clés utilisé par cet objet SslStream.

KeyExchangeStrength
Obsolète.

Obtient une valeur qui identifie la force de l’algorithme d’échange de clés utilisé par cette instance.

LeaveInnerStreamOpen

Obtient si le flux utilisé par ce AuthenticatedStream flux pour l’envoi et la réception de données a été laissé ouvert.

(Hérité de AuthenticatedStream)
Length

Obtient la longueur du flux sous-jacent.

LocalCertificate

Obtient le certificat utilisé pour authentifier le point de terminaison local.

NegotiatedApplicationProtocol

Protocole d’application négocié dans la négociation TLS.

NegotiatedCipherSuite

Obtient la suite de chiffrement qui a été négociée pour cette connexion.

Position

Obtient ou définit la position actuelle dans le flux sous-jacent.

ReadTimeout

Obtient ou définit la durée, exprimée en millisecondes, un bloc d’opération de lecture en attente de données.

RemoteCertificate

Obtient le certificat utilisé pour authentifier le point de terminaison distant.

SslProtocol

Obtient une valeur qui indique le protocole de sécurité utilisé pour authentifier cette connexion.

TargetHostName

Obtient le nom du serveur auquel le client tente de se connecter. Ce nom est utilisé pour la validation du certificat de serveur. Il peut s’agir d’un nom DNS ou d’une adresse IP.

TransportContext

Obtient l’utilisation de l’authentification à l’aide TransportContext d’une protection étendue.

WriteTimeout

Obtient ou définit la durée pendant laquelle une opération d’écriture bloque l’attente des données.

Méthodes

Nom Description
AuthenticateAsClient(SslClientAuthenticationOptions)

Authentifie le serveur et éventuellement le client dans une connexion client-serveur.

AuthenticateAsClient(String, X509CertificateCollection, 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 par défaut du système.

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 et le protocole SSL spécifiés.

AuthenticateAsClient(String)

Appelé par les clients pour authentifier le serveur et éventuellement le client dans une connexion client-serveur.

AuthenticateAsClientAsync(SslClientAuthenticationOptions, CancellationToken)

Appelé par les clients pour authentifier le serveur et éventuellement le client dans une connexion client-serveur en tant qu’opération asynchrone. Le processus d’authentification utilise des informations spécifiées dans le conteneur de sslClientAuthenticationOptions propriétés.

AuthenticateAsClientAsync(String, X509CertificateCollection, Boolean)

Appelé par les clients pour authentifier le serveur et éventuellement le client dans une connexion client-serveur en tant qu’opération asynchrone. Le processus d’authentification utilise la collection de certificats spécifiée et le protocole SSL par défaut du système.

AuthenticateAsClientAsync(String, X509CertificateCollection, SslProtocols, Boolean)

Appelé par les clients pour authentifier le serveur et éventuellement le client dans une connexion client-serveur en tant qu’opération asynchrone. Le processus d’authentification utilise la collection de certificats et le protocole SSL spécifiés.

AuthenticateAsClientAsync(String)

Appelé par les clients pour authentifier le serveur et éventuellement le client dans une connexion client-serveur en tant qu’opération asynchrone.

AuthenticateAsServer(SslServerAuthenticationOptions)

Appelé par les serveurs pour authentifier le serveur et éventuellement le client dans une connexion client-serveur à l’aide du certificat spécifié.

AuthenticateAsServer(X509Certificate, Boolean, Boolean)

Appelé par les serveurs pour authentifier le serveur et éventuellement le client dans une connexion client-serveur à l’aide des certificats et exigences spécifiés, et à l’aide du protocole de sécurité par défaut du système.

AuthenticateAsServer(X509Certificate, Boolean, SslProtocols, Boolean)

Appelé par les serveurs pour authentifier le serveur et éventuellement le client dans une connexion client-serveur à l’aide des certificats, exigences et protocole de sécurité spécifiés.

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é.

AuthenticateAsServerAsync(ServerOptionsSelectionCallback, Object, CancellationToken)

Appelé par les serveurs pour authentifier le serveur et éventuellement le client dans une connexion client-serveur en tant qu’opération asynchrone. Le processus d’authentification utilise les informations retournées par optionsCallback.

AuthenticateAsServerAsync(SslServerAuthenticationOptions, CancellationToken)

Authentifie le serveur et éventuellement le client dans une connexion client-serveur en tant qu’opération asynchrone. Le processus d’authentification utilise des informations spécifiées dans le conteneur de sslServerAuthenticationOptions propriétés.

AuthenticateAsServerAsync(X509Certificate, Boolean, Boolean)

Appelé par les serveurs pour authentifier le serveur et éventuellement le client dans une connexion client-serveur à l’aide des certificats, exigences et protocole de sécurité spécifiés en tant qu’opération asynchrone.

AuthenticateAsServerAsync(X509Certificate, Boolean, SslProtocols, Boolean)

Appelé par les serveurs pour authentifier le serveur et éventuellement le client dans une connexion client-serveur à l’aide des certificats, exigences et protocole de sécurité spécifiés en tant qu’opération asynchrone.

AuthenticateAsServerAsync(X509Certificate)

Appelé par les serveurs pour authentifier le serveur et éventuellement le client dans une connexion client-serveur à l’aide du certificat spécifié en tant qu’opération asynchrone.

BeginAuthenticateAsClient(String, AsyncCallback, Object)

Appelé par les clients pour commencer une opération asynchrone pour authentifier le serveur et éventuellement le client.

BeginAuthenticateAsClient(String, X509CertificateCollection, 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é par défaut du système.

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 et du protocole de sécurité spécifiés.

BeginAuthenticateAsServer(X509Certificate, AsyncCallback, Object)

Appelé par les serveurs pour commencer une opération asynchrone pour authentifier le client et éventuellement le serveur dans une connexion client-serveur.

BeginAuthenticateAsServer(X509Certificate, Boolean, 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 et exigences spécifiés et du protocole de sécurité par défaut du système.

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, exigences et protocole de sécurité spécifiés.

BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)

Commence une opération de lecture asynchrone qui lit les données du flux et les stocke dans le tableau spécifié.

BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)

Commence une opération d’écriture asynchrone qui écrit Bytedes s à partir de la mémoire tampon spécifiée dans le flux.

Close()

Ferme le flux actuel et libère toutes les ressources (telles que les sockets et les handles de fichiers) associées au flux actuel. Au lieu d’appeler cette méthode, vérifiez que le flux est correctement supprimé.

(Hérité de Stream)
CopyTo(Stream, Int32)

Lit les octets du flux actuel et les écrit dans un autre flux à l’aide d’une taille de mémoire tampon spécifiée. Les deux positions de flux sont avancées par le nombre d’octets copiés.

(Hérité de Stream)
CopyTo(Stream)

Lit les octets du flux actuel et les écrit dans un autre flux. Les deux positions de flux sont avancées par le nombre d’octets copiés.

(Hérité de Stream)
CopyToAsync(Stream, CancellationToken)

Lit de manière asynchrone les octets du flux actuel et les écrit dans un autre flux à l’aide d’un jeton d’annulation spécifié. Les deux positions de flux sont avancées par le nombre d’octets copiés.

(Hérité de Stream)
CopyToAsync(Stream, Int32, CancellationToken)

Lit de manière asynchrone les octets du flux actuel et les écrit dans un autre flux à l’aide d’une taille de mémoire tampon et d’un jeton d’annulation spécifiés. Les deux positions de flux sont avancées par le nombre d’octets copiés.

(Hérité de Stream)
CopyToAsync(Stream, Int32)

Lit de façon asynchrone les octets du flux actuel et les écrit dans un autre flux à l’aide d’une taille de mémoire tampon spécifiée. Les deux positions de flux sont avancées par le nombre d’octets copiés.

(Hérité de Stream)
CopyToAsync(Stream)

Lit de manière asynchrone les octets du flux actuel et les écrit dans un autre flux. Les deux positions de flux sont avancées par le nombre d’octets copiés.

(Hérité de Stream)
CreateObjRef(Type)

Crée un objet qui contient toutes les informations pertinentes requises pour générer un proxy utilisé pour communiquer avec un objet distant.

(Hérité de MarshalByRefObject)
CreateWaitHandle()
Obsolète.
Obsolète.
Obsolète.

Alloue un WaitHandle objet.

(Hérité de Stream)
Dispose()

Libère toutes les ressources utilisées par le Stream.

(Hérité de Stream)
Dispose(Boolean)

Libère les ressources non managées utilisées par les SslStream ressources gérées et libère éventuellement les ressources managées.

Dispose(Boolean)

Libère les ressources non managées utilisées par les AuthenticatedStream ressources gérées et libère éventuellement les ressources managées.

(Hérité de AuthenticatedStream)
DisposeAsync()

Libère de façon asynchrone les ressources non managées et gérées utilisées par le SslStream.

EndAuthenticateAsClient(IAsyncResult)

Termine une opération d’authentification de serveur asynchrone en attente démarrée avec un appel précédent à BeginAuthenticateAsClient.

EndAuthenticateAsServer(IAsyncResult)

Termine une opération d’authentification client asynchrone en attente démarrée avec un appel précédent à BeginAuthenticateAsClient.

EndRead(IAsyncResult)

Termine une opération de lecture asynchrone démarrée avec un appel précédent à BeginRead(Byte[], Int32, Int32, AsyncCallback, Object).

EndWrite(IAsyncResult)

Termine une opération d’écriture asynchrone démarrée avec un appel précédent à BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object).

Equals(Object)

Détermine si l’objet spécifié est égal à l’objet actuel.

(Hérité de Object)
Finalize()

Libère toutes les ressources utilisées par le SslStream.

Flush()

Entraîne l’écriture de toutes les données mises en mémoire tampon sur l’appareil sous-jacent.

FlushAsync()

Efface de façon asynchrone toutes les mémoires tampons de ce flux et entraîne l’écriture de toutes les données mises en mémoire tampon sur l’appareil sous-jacent.

(Hérité de Stream)
FlushAsync(CancellationToken)

Écrit de manière asynchrone toutes les données mises en mémoire tampon sur l’appareil sous-jacent.

FlushAsync(CancellationToken)

Efface de façon asynchrone toutes les mémoires tampons de ce flux, entraîne l’écriture de toutes les données mises en mémoire tampon sur l’appareil sous-jacent et surveille les demandes d’annulation.

(Hérité de Stream)
GetHashCode()

Sert de fonction de hachage par défaut.

(Hérité de Object)
GetLifetimeService()
Obsolète.

Récupère l’objet de service de durée de vie actuel qui contrôle la stratégie de durée de vie de cette instance.

(Hérité de MarshalByRefObject)
GetType()

Obtient la Type de l’instance actuelle.

(Hérité de Object)
InitializeLifetimeService()
Obsolète.

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)
MemberwiseClone()

Crée une copie superficielle du Objectactuel.

(Hérité de Object)
MemberwiseClone(Boolean)

Crée une copie superficielle de l’objet actuel MarshalByRefObject .

(Hérité de MarshalByRefObject)
NegotiateClientCertificateAsync(CancellationToken)

Négocie le certificat client sur la connexion authentifiée.

ObjectInvariant()
Obsolète.

Fournit la prise en charge d’un Contract.

(Hérité de Stream)
Read(Byte[], Int32, Int32)

Lit les données de ce flux et les stocke dans le tableau spécifié.

Read(Span<Byte>)

En cas de substitution dans une classe dérivée, lit une séquence d’octets à partir du flux actuel et avance la position dans le flux par le nombre d’octets lus.

Read(Span<Byte>)

En cas de substitution dans une classe dérivée, lit une séquence d’octets à partir du flux actuel et avance la position dans le flux par le nombre d’octets lus.

(Hérité de Stream)
ReadAsync(Byte[], Int32, Int32, CancellationToken)

Lit de façon asynchrone les données de ce flux et les stocke dans la plage spécifiée d’un tableau d’octets.

ReadAsync(Byte[], Int32, Int32, CancellationToken)

Lit de façon asynchrone une séquence d’octets à partir du flux actuel, avance la position dans le flux en fonction du nombre d’octets lus et surveille les demandes d’annulation.

(Hérité de Stream)
ReadAsync(Byte[], Int32, Int32)

Lit de façon asynchrone une séquence d’octets à partir du flux actuel et avance la position dans le flux en fonction du nombre d’octets lus.

(Hérité de Stream)
ReadAsync(Memory<Byte>, CancellationToken)

Lit de façon asynchrone les données de ce flux et les stocke dans la plage de mémoire spécifiée.

ReadAsync(Memory<Byte>, CancellationToken)

Lit de façon asynchrone une séquence d’octets à partir du flux actuel, avance la position dans le flux en fonction du nombre d’octets lus et surveille les demandes d’annulation.

(Hérité de Stream)
ReadAtLeast(Span<Byte>, Int32, Boolean)

Lit au moins un nombre minimal d’octets du flux actuel et avance la position dans le flux par le nombre d’octets lus.

(Hérité de Stream)
ReadAtLeastAsync(Memory<Byte>, Int32, Boolean, CancellationToken)

Lit de façon asynchrone au moins un nombre minimal d’octets à partir du flux actuel, avance la position dans le flux par le nombre d’octets lus et surveille les demandes d’annulation.

(Hérité de Stream)
ReadByte()

Lit un octet à partir du SslStream flux et avance la position dans le flux d’un octet ou retourne -1 si à la fin du flux.

ReadByte()

Lit un octet à partir du flux et avance la position dans le flux d’un octet, ou retourne -1 si à la fin du flux.

(Hérité de Stream)
ReadExactly(Byte[], Int32, Int32)

Lit le nombre d’octets count du flux actuel et avance la position dans le flux.

(Hérité de Stream)
ReadExactly(Span<Byte>)

Lit les octets du flux actuel et avance la position dans le flux jusqu’à ce que le buffer flux soit rempli.

(Hérité de Stream)
ReadExactlyAsync(Byte[], Int32, Int32, CancellationToken)

Lit de façon asynchrone le nombre d’octets count du flux actuel, avance la position dans le flux et surveille les demandes d’annulation.

(Hérité de Stream)
ReadExactlyAsync(Memory<Byte>, CancellationToken)

Lit de façon asynchrone les octets du flux actuel, avance la position dans le flux jusqu’à ce que le buffer flux soit rempli et surveille les demandes d’annulation.

(Hérité de Stream)
Seek(Int64, SeekOrigin)

Lève un NotSupportedException.

SetLength(Int64)

Définit la longueur du flux sous-jacent.

ShutdownAsync()

Arrête ce SslStream.

ToString()

Retourne une chaîne qui représente l’objet actuel.

(Hérité de Object)
Write(Byte[], Int32, Int32)

Écrivez le nombre spécifié de Bytes dans le flux sous-jacent à l’aide de la mémoire tampon et du décalage spécifiés.

Write(Byte[])

Écrit les données spécifiées dans ce flux.

Write(ReadOnlySpan<Byte>)

En cas de substitution dans une classe dérivée, écrit une séquence d’octets dans le flux actuel et avance la position actuelle dans ce flux par le nombre d’octets écrits.

Write(ReadOnlySpan<Byte>)

En cas de substitution dans une classe dérivée, écrit une séquence d’octets dans le flux actuel et avance la position actuelle dans ce flux par le nombre d’octets écrits.

(Hérité de Stream)
WriteAsync(Byte[], Int32, Int32, CancellationToken)

Écrit de façon asynchrone des données dans le flux sous-jacent à partir de la plage spécifiée d’un tableau d’octets.

WriteAsync(Byte[], Int32, Int32, CancellationToken)

Écrit de façon asynchrone une séquence d’octets dans le flux actuel, avance la position actuelle dans ce flux par le nombre d’octets écrits et surveille les demandes d’annulation.

(Hérité de Stream)
WriteAsync(Byte[], Int32, Int32)

Écrit de façon asynchrone une séquence d’octets dans le flux actuel et avance la position actuelle dans ce flux par le nombre d’octets écrits.

(Hérité de Stream)
WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

Écrit de façon asynchrone des données dans le flux sous-jacent à partir d’une plage de mémoire d’octets en lecture seule.

WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

Écrit de façon asynchrone une séquence d’octets dans le flux actuel, avance la position actuelle dans ce flux par le nombre d’octets écrits et surveille les demandes d’annulation.

(Hérité de Stream)
WriteByte(Byte)

Écrit un octet à la position actuelle dans le flux et avance la position dans le flux d’un octet.

WriteByte(Byte)

Écrit un octet à la position actuelle dans le flux et avance la position dans le flux d’un octet.

(Hérité de Stream)

Méthodes d’extension

Nom Description
ConfigureAwait(IAsyncDisposable, Boolean)

Configure la façon dont les attentes sur les tâches retournées à partir d’un jetable asynchrone sont effectuées.

CopyToAsync(Stream, PipeWriter, CancellationToken)

Lit de façon asynchrone les octets des Stream octets et les écrit dans le jeton d’annulation spécifié PipeWriter.

S’applique à

Voir aussi