SslStream Klas

Definitie

Biedt een stroom die wordt gebruikt voor client-servercommunicatie die gebruikmaakt van het SSL-beveiligingsprotocol (Secure Socket Layer) om de server en eventueel de client te verifiëren.

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
Overname

Voorbeelden

In het volgende codevoorbeeld ziet u hoe u een TcpListener maakt die gebruikmaakt van de SslStream klasse om te communiceren met 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

In het volgende codevoorbeeld ziet u hoe u een TcpClient maakt die gebruikmaakt van de SslStream klasse om te communiceren met een server.

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

Opmerkingen

SSL-protocollen helpen om vertrouwelijkheid en integriteitscontrole te bieden voor berichten die worden verzonden met behulp van een SslStream. Een SSL-verbinding, zoals die door SslStream, moet worden gebruikt bij het communiceren van gevoelige informatie tussen een client en een server. Met behulp van een SslStream hulpprogramma voorkomt u dat iedereen informatie leest en knoeit terwijl deze onderweg is op het netwerk.

Een SslStream exemplaar verzendt gegevens met behulp van een stroom die u opgeeft bij het maken van de SslStream. Wanneer u deze onderliggende stroom opgeeft, kunt u opgeven of de SslStream onderliggende stroom ook wordt gesloten. Normaal gesproken wordt de SslStream klasse gebruikt met de TcpClient en TcpListener klassen. De GetStream methode biedt een NetworkStream geschikt voor gebruik met de SslStream klasse.

Na het maken van een SslStream, de server en eventueel, moet de client worden geverifieerd. De server moet een X509-certificaat opgeven waarmee een bewijs van de identiteit wordt vastgesteld en dat de client dit ook kan aanvragen. Verificatie moet worden uitgevoerd voordat gegevens worden verzonden met behulp van een SslStream. Clients starten verificatie met behulp van de synchrone AuthenticateAsClient methoden, die blokkeren totdat de verificatie is voltooid, of de asynchrone BeginAuthenticateAsClient methoden, die niet blokkeren totdat de verificatie is voltooid. Servers initiëren verificatie met behulp van de synchrone AuthenticateAsServer of asynchrone BeginAuthenticateAsServer methoden. Zowel client als server moeten de verificatie initiëren.

De verificatie wordt verwerkt door de SSPI-kanaalprovider (Security Support Provider). De client krijgt de mogelijkheid om de validatie van het certificaat van de server te beheren door een RemoteCertificateValidationCallback gemachtigde op te geven bij het maken van een SslStream. De server kan ook de validatie beheren door een RemoteCertificateValidationCallback gemachtigde op te leveren. De methode waarnaar door de gemachtigde wordt verwezen, bevat het certificaat van de externe partij en eventuele fouten die SSPI heeft aangetroffen tijdens het valideren van het certificaat. Als de server een gemachtigde opgeeft, wordt de methode van de gemachtigde aangeroepen, ongeacht of de server clientverificatie heeft aangevraagd. Als de server geen clientverificatie heeft aangevraagd, ontvangt de gemachtigde methode van de server een null-certificaat en een lege matrix met certificaatfouten.

Als de server clientverificatie vereist, moet de client een of meer certificaten voor verificatie opgeven. Als de client meer dan één certificaat heeft, kan de client een LocalCertificateSelectionCallback gemachtigde opgeven om het juiste certificaat voor de server te selecteren. De certificaten van de client moeten zich bevinden in het certificaatarchief 'Mijn' van de huidige gebruiker. Clientverificatie via certificaten wordt niet ondersteund voor het Ssl2 protocol (SSL versie 2).

Als de verificatie mislukt, ontvangt u een AuthenticationExceptionen het SslStream is niet meer bruikbaar. Sluit dit object en verwijder alle verwijzingen naar het object, zodat het kan worden verzameld door de garbagecollector.

Wanneer het verificatieproces, ook wel bekend als de SSL-handshake, slaagt, wordt de identiteit van de server (en optioneel, de client) tot stand gebracht en kan de SslStream client en server worden gebruikt om berichten uit te wisselen. Voordat informatie wordt verzonden of ontvangen, moeten de client en server de beveiligingsservices en niveaus controleren die door de klant SslStream worden geleverd om te bepalen of het protocol, de algoritmen en de geselecteerde sterke punten voldoen aan hun vereisten voor integriteit en vertrouwelijkheid. Als de huidige instellingen niet voldoende zijn, moet de stream worden gesloten. U kunt de beveiligingsservices controleren die worden geleverd met behulp SslStream van de IsEncrypted en IsSigned eigenschappen. In de volgende tabel ziet u de elementen die de cryptografische instellingen rapporteren die worden gebruikt voor verificatie, versleuteling en gegevensondertekening.

Element Leden
Het beveiligingsprotocol dat wordt gebruikt voor het verifiëren van de server en, optioneel, de client. De SslProtocol eigenschap en de bijbehorende SslProtocols opsomming.
Het algoritme voor sleuteluitwisseling. De KeyExchangeAlgorithm eigenschap en de bijbehorende ExchangeAlgorithmType opsomming.
Het algoritme voor berichtintegriteit. De HashAlgorithm eigenschap en de bijbehorende HashAlgorithmType opsomming.
Het algoritme voor vertrouwelijkheid van berichten. De CipherAlgorithm eigenschap en de bijbehorende CipherAlgorithmType opsomming.
De sterke punten van de geselecteerde algoritmen. De KeyExchangeStrength, HashStrengthen CipherStrength eigenschappen.

Na een geslaagde verificatie kunt u gegevens verzenden met behulp van de synchrone Write of asynchrone BeginWrite methoden. U kunt gegevens ontvangen met behulp van de synchrone Read of asynchrone BeginRead methoden.

Als u hebt SslStream opgegeven dat de onderliggende stream open moet blijven, bent u verantwoordelijk voor het sluiten van die stream wanneer u klaar bent met het gebruik ervan.

Note

Als de toepassing die het SslStream object maakt, wordt uitgevoerd met de referenties van een normale gebruiker, heeft de toepassing geen toegang tot certificaten die zijn geïnstalleerd in het archief van de lokale computer, tenzij expliciet toestemming is verleend aan de gebruiker om dit te doen.

SslStream gaat ervan uit dat een time-out samen met een andere IOException wanneer een van de binnenste stroom wordt gegenereerd, door de beller als onherstelbaar wordt behandeld. Het opnieuw gebruiken van een SslStream exemplaar na een time-out retourneert garbage. In deze gevallen moet CloseSslStream een toepassing een uitzondering genereren.

Het .NET Framework 4.6 bevat een beveiligingsfunctie waarmee onveilige coderings- en hashalgoritmen voor verbindingen worden geblokkeerd. Toepassingen die TLS/SSL gebruiken via API's zoals HttpClient, HttpWebRequest, FTPClient, SmtpClient en SslStream en gericht zijn op .NET Framework 4.6 krijgen standaard het veiligere gedrag.

Ontwikkelaars willen zich mogelijk afmelden voor dit gedrag om de interoperabiliteit met hun bestaande SSL3-services OF TLS met RC4-services te behouden. In dit artikel wordt uitgelegd hoe u uw code kunt wijzigen, zodat het nieuwe gedrag is uitgeschakeld.

De .NET Framework 4.7 voegt nieuwe overbelastingen toe voor de methoden die SslStreams verifiëren die geen TLS-versie opgeven, maar in plaats daarvan de TLS-versie gebruiken die is gedefinieerd als de systeemstandaard in SCHANNEL. Gebruik deze methoden in uw app als een manier om de standaardwaarden later te kunnen wijzigen als de aanbevolen procedure voor TLS-versies na verloop van tijd wordt gewijzigd, zonder dat u uw app opnieuw hoeft te bouwen en opnieuw te implementeren.

Zie ook TLS-best practices (Transport Layer Security) met het .NET Framework.

Constructors

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

Initialiseert een nieuw exemplaar van de SslStream klasse met behulp van de opgegeven Stream.

SslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback)

Initialiseert een nieuw exemplaar van de SslStream klasse met behulp van het opgegeven Streamgedrag voor het sluiten van stromen, de gemachtigde voor certificaatvalidatie en de gedelegeerde voor certificaatselectie.

SslStream(Stream, Boolean, RemoteCertificateValidationCallback)

Initialiseert een nieuw exemplaar van de SslStream klasse met behulp van het opgegeven Streamgedrag voor het sluiten van stromen en de gemachtigde voor certificaatvalidatie.

SslStream(Stream, Boolean)

Initialiseert een nieuw exemplaar van de SslStream klasse met behulp van het opgegeven Stream gedrag en het afsluiten van stromen.

SslStream(Stream)

Initialiseert een nieuw exemplaar van de SslStream klasse met behulp van de opgegeven Stream.

Eigenschappen

Name Description
CanRead

Hiermee wordt een Boolean waarde opgehaald die aangeeft of de onderliggende stroom leesbaar is.

CanSeek

Hiermee wordt een Boolean waarde opgehaald die aangeeft of de onderliggende stroom kan worden gezocht.

CanTimeout

Hiermee wordt een Boolean waarde opgehaald die aangeeft of de onderliggende stroom time-outs ondersteunt.

CanWrite

Hiermee wordt een Boolean waarde opgehaald die aangeeft of de onderliggende stroom beschrijfbaar is.

CheckCertRevocationStatus

Hiermee wordt een Boolean waarde opgehaald die aangeeft of de certificaatintrekkingslijst is gecontroleerd tijdens het certificaatvalidatieproces.

CipherAlgorithm

Hiermee haalt u een waarde op waarmee het algoritme voor bulkversleuteling wordt geïdentificeerd dat door dit SslStreamwordt gebruikt.

CipherStrength

Hiermee wordt een waarde opgehaald die de sterkte van het coderingsalgoritmen identificeert dat door dit SslStreamwordt gebruikt.

HashAlgorithm

Hiermee haalt u het algoritme op dat wordt gebruikt voor het genereren van berichtverificatiecodes (MACs).

HashStrength

Hiermee wordt een waarde opgehaald die de sterkte van het hash-algoritme identificeert dat door dit exemplaar wordt gebruikt.

InnerStream

Hiermee haalt u de stream op die wordt AuthenticatedStream gebruikt voor het verzenden en ontvangen van gegevens.

(Overgenomen van AuthenticatedStream)
IsAuthenticated

Hiermee wordt een Boolean waarde opgehaald die aangeeft of de verificatie is geslaagd.

IsEncrypted

Hiermee wordt een Boolean waarde opgehaald die aangeeft of er SslStream gegevensversleuteling wordt gebruikt.

IsMutuallyAuthenticated

Hiermee wordt een Boolean waarde opgehaald die aangeeft of zowel de server als de client zijn geverifieerd.

IsServer

Hiermee wordt een Boolean waarde opgehaald die aangeeft of de lokale kant van de verbinding die door deze SslStream verbinding wordt gebruikt, is geverifieerd als de server.

IsSigned

Hiermee wordt een Boolean waarde opgehaald die aangeeft of de gegevens die met deze stream worden verzonden, zijn ondertekend.

KeyExchangeAlgorithm

Hiermee haalt u het algoritme voor sleuteluitwisseling op dat wordt gebruikt.SslStream

KeyExchangeStrength

Hiermee haalt u een waarde op waarmee de sterkte wordt geïdentificeerd van het algoritme voor sleuteluitwisseling dat door dit exemplaar wordt gebruikt.

LeaveInnerStreamOpen

Hiermee wordt aangegeven of de stream die door deze AuthenticatedStream stroom wordt gebruikt voor het verzenden en ontvangen van gegevens, open is gelaten.

(Overgenomen van AuthenticatedStream)
Length

Hiermee haalt u de lengte van de onderliggende stroom op.

LocalCertificate

Hiermee haalt u het certificaat op dat wordt gebruikt om het lokale eindpunt te verifiëren.

NegotiatedApplicationProtocol

Het onderhandelde toepassingsprotocol in TLS-handshake.

Position

Hiermee haalt u de huidige positie in de onderliggende stroom op of stelt u deze in.

ReadTimeout

Hiermee wordt de hoeveelheid tijd opgehaald of ingesteld, uitgedrukt in milliseconden, een leesbewerkingsblok dat wacht op gegevens.

RemoteCertificate

Hiermee haalt u het certificaat op dat wordt gebruikt om het externe eindpunt te verifiëren.

SslProtocol

Hiermee wordt een waarde opgehaald die aangeeft welk beveiligingsprotocol wordt gebruikt om deze verbinding te verifiëren.

TransportContext

Hiermee haalt u de TransportContext gebruikte verificatie op met uitgebreide beveiliging.

WriteTimeout

Hiermee haalt u de hoeveelheid tijd op die een schrijfbewerking blokkeert die wacht op gegevens.

Methoden

Name Description
AuthenticateAsClient(String, X509CertificateCollection, Boolean)

Aangeroepen door clients om de server en eventueel de client in een client-serververbinding te verifiëren. Het verificatieproces maakt gebruik van de opgegeven certificaatverzameling en het standaard SSL-protocol van het systeem.

AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean)

Aangeroepen door clients om de server en eventueel de client in een client-serververbinding te verifiëren. Het verificatieproces maakt gebruik van de opgegeven certificaatverzameling en het SSL-protocol.

AuthenticateAsClient(String)

Aangeroepen door clients om de server en eventueel de client in een client-serververbinding te verifiëren.

AuthenticateAsClientAsync(SslClientAuthenticationOptions, CancellationToken)

Aangeroepen door clients om de server te verifiëren en optioneel de client in een client-serververbinding als asynchrone bewerking. Het verificatieproces maakt gebruik van gegevens die zijn opgegeven in de sslClientAuthenticationOptions eigenschappenverzameling.

AuthenticateAsClientAsync(String, X509CertificateCollection, Boolean)

Aangeroepen door clients om de server te verifiëren en optioneel de client in een client-serververbinding als asynchrone bewerking. Het verificatieproces maakt gebruik van de opgegeven certificaatverzameling en het standaard SSL-protocol van het systeem.

AuthenticateAsClientAsync(String, X509CertificateCollection, SslProtocols, Boolean)

Aangeroepen door clients om de server te verifiëren en optioneel de client in een client-serververbinding als asynchrone bewerking. Het verificatieproces maakt gebruik van de opgegeven certificaatverzameling en het SSL-protocol.

AuthenticateAsClientAsync(String)

Aangeroepen door clients om de server te verifiëren en optioneel de client in een client-serververbinding als asynchrone bewerking.

AuthenticateAsServer(X509Certificate, Boolean, Boolean)

Wordt aangeroepen door servers om de server en eventueel de client in een clientserververbinding te verifiëren met behulp van de opgegeven certificaten en vereisten en het standaardbeveiligingsprotocol van het systeem.

AuthenticateAsServer(X509Certificate, Boolean, SslProtocols, Boolean)

Wordt aangeroepen door servers om de server en eventueel de client in een client-serververbinding te verifiëren met behulp van de opgegeven certificaten, vereisten en beveiligingsprotocol.

AuthenticateAsServer(X509Certificate)

Aangeroepen door servers om de server en eventueel de client in een client-serververbinding te verifiëren met behulp van het opgegeven certificaat.

AuthenticateAsServerAsync(SslServerAuthenticationOptions, CancellationToken)

Verifieert de server en eventueel de client in een client-serververbinding als asynchrone bewerking. Het verificatieproces maakt gebruik van gegevens die zijn opgegeven in de sslServerAuthenticationOptions eigenschappenverzameling.

AuthenticateAsServerAsync(X509Certificate, Boolean, Boolean)

Aangeroepen door servers om de server en eventueel de client in een client-serververbinding te verifiëren met behulp van de opgegeven certificaten, vereisten en beveiligingsprotocol als asynchrone bewerking.

AuthenticateAsServerAsync(X509Certificate, Boolean, SslProtocols, Boolean)

Aangeroepen door servers om de server en eventueel de client in een client-serververbinding te verifiëren met behulp van de opgegeven certificaten, vereisten en beveiligingsprotocol als asynchrone bewerking.

AuthenticateAsServerAsync(X509Certificate)

Aangeroepen door servers om de server en eventueel de client in een client-serververbinding te verifiëren met behulp van het opgegeven certificaat als asynchrone bewerking.

BeginAuthenticateAsClient(String, AsyncCallback, Object)

Aangeroepen door clients om een asynchrone bewerking te starten om de server en eventueel de client te verifiëren.

BeginAuthenticateAsClient(String, X509CertificateCollection, Boolean, AsyncCallback, Object)

Clients worden aangeroepen om een asynchrone bewerking te starten om de server te verifiëren en eventueel de client met behulp van de opgegeven certificaten en het standaardbeveiligingsprotocol van het systeem.

BeginAuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean, AsyncCallback, Object)

Clients worden aangeroepen om een asynchrone bewerking te starten om de server te verifiëren en eventueel de client met behulp van de opgegeven certificaten en het beveiligingsprotocol.

BeginAuthenticateAsServer(X509Certificate, AsyncCallback, Object)

Wordt aangeroepen door servers om een asynchrone bewerking te starten om de client en eventueel de server in een client-serververbinding te verifiëren.

BeginAuthenticateAsServer(X509Certificate, Boolean, Boolean, AsyncCallback, Object)

Wordt aangeroepen door servers om een asynchrone bewerking te starten om de server te verifiëren en eventueel de client met behulp van de opgegeven certificaten en vereisten, en het standaardbeveiligingsprotocol van het systeem.

BeginAuthenticateAsServer(X509Certificate, Boolean, SslProtocols, Boolean, AsyncCallback, Object)

Wordt aangeroepen door servers om een asynchrone bewerking te starten om de server te verifiëren en eventueel de client met behulp van de opgegeven certificaten, vereisten en beveiligingsprotocol.

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

Hiermee wordt een asynchrone leesbewerking gestart waarmee gegevens uit de stroom worden gelezen en opgeslagen in de opgegeven matrix.

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

Hiermee wordt een asynchrone schrijfbewerking gestart die s van de opgegeven buffer naar de stream schrijft Byte.

Close()

Hiermee sluit u de huidige stroom en worden alle resources (zoals sockets en bestandsingangen) die aan de huidige stroom zijn gekoppeld, vrijgegeven. In plaats van deze methode aan te roepen, moet u ervoor zorgen dat de stream correct wordt verwijderd.

(Overgenomen van Stream)
CopyTo(Stream, Int32)

Leest de bytes uit de huidige stream en schrijft ze naar een andere stroom, met behulp van een opgegeven buffergrootte. Beide streamsposities worden geavanceerd door het aantal gekopieerde bytes.

(Overgenomen van Stream)
CopyTo(Stream)

Leest de bytes uit de huidige stream en schrijft ze naar een andere stream. Beide streamsposities worden geavanceerd door het aantal gekopieerde bytes.

(Overgenomen van Stream)
CopyToAsync(Stream, CancellationToken)

Asynchroon leest de bytes uit de huidige stream en schrijft deze naar een andere stream met behulp van een opgegeven annuleringstoken. Beide streamsposities worden geavanceerd door het aantal gekopieerde bytes.

(Overgenomen van Stream)
CopyToAsync(Stream, Int32, CancellationToken)

Asynchroon leest de bytes uit de huidige stream en schrijft deze naar een andere stroom, met behulp van een opgegeven buffergrootte en annuleringstoken. Beide streamsposities worden geavanceerd door het aantal gekopieerde bytes.

(Overgenomen van Stream)
CopyToAsync(Stream, Int32)

Asynchroon leest de bytes uit de huidige stream en schrijft deze naar een andere stroom, met behulp van een opgegeven buffergrootte. Beide streamsposities worden geavanceerd door het aantal gekopieerde bytes.

(Overgenomen van Stream)
CopyToAsync(Stream)

Asynchroon leest de bytes uit de huidige stream en schrijft ze naar een andere stream. Beide streamsposities worden geavanceerd door het aantal gekopieerde bytes.

(Overgenomen van Stream)
CreateObjRef(Type)

Hiermee maakt u een object dat alle relevante informatie bevat die nodig is om een proxy te genereren die wordt gebruikt om te communiceren met een extern object.

(Overgenomen van MarshalByRefObject)
CreateWaitHandle()
Verouderd.

Wijst een WaitHandle object toe.

(Overgenomen van Stream)
Dispose()

Alle resources die worden gebruikt door de Stream.

(Overgenomen van Stream)
Dispose(Boolean)

Publiceert de niet-beheerde resources die worden gebruikt door de SslStream beheerde resources en brengt eventueel de beheerde resources vrij.

DisposeAsync()

Asynchroon publiceert de onbeheerde en beheerde resources die worden gebruikt door de SslStream.

EndAuthenticateAsClient(IAsyncResult)

Hiermee wordt een asynchrone serververificatiebewerking beëindigd die is gestart met een eerdere aanroep naar BeginAuthenticateAsClient.

EndAuthenticateAsServer(IAsyncResult)

Hiermee wordt een asynchrone clientverificatiebewerking beëindigd die is gestart met een eerdere aanroep naar BeginAuthenticateAsClient.

EndRead(IAsyncResult)

Hiermee wordt een asynchrone leesbewerking beëindigd die is gestart met een vorige aanroep naar BeginRead(Byte[], Int32, Int32, AsyncCallback, Object).

EndWrite(IAsyncResult)

Hiermee wordt een asynchrone schrijfbewerking beëindigd die is gestart met een eerdere aanroep naar BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object).

Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige object.

(Overgenomen van Object)
Flush()

Zorgt ervoor dat eventuele gebufferde gegevens naar het onderliggende apparaat worden geschreven.

FlushAsync()

Asynchroon wist alle buffers voor deze stroom en zorgt ervoor dat eventuele gebufferde gegevens naar het onderliggende apparaat worden geschreven.

(Overgenomen van Stream)
FlushAsync(CancellationToken)

Asynchroon schrijft eventuele gebufferde gegevens naar het onderliggende apparaat.

FlushAsync(CancellationToken)

Asynchroon wist alle buffers voor deze stroom, zorgt ervoor dat gebufferde gegevens naar het onderliggende apparaat worden geschreven en annuleringsaanvragen worden gecontroleerd.

(Overgenomen van Stream)
GetHashCode()

Fungeert als de standaardhashfunctie.

(Overgenomen van Object)
GetLifetimeService()

Hiermee haalt u het huidige levensduurserviceobject op waarmee het levensduurbeleid voor dit exemplaar wordt beheerd.

(Overgenomen van MarshalByRefObject)
GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
InitializeLifetimeService()

Hiermee haalt u een levensduurserviceobject op om het levensduurbeleid voor dit exemplaar te beheren.

(Overgenomen van MarshalByRefObject)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
MemberwiseClone(Boolean)

Hiermee maakt u een ondiepe kopie van het huidige MarshalByRefObject object.

(Overgenomen van MarshalByRefObject)
ObjectInvariant()
Verouderd.

Biedt ondersteuning voor een Contract.

(Overgenomen van Stream)
Read(Byte[], Int32, Int32)

Leest gegevens uit deze stream en slaat deze op in de opgegeven matrix.

Read(Span<Byte>)

Wanneer deze wordt overschreven in een afgeleide klasse, leest u een reeks bytes uit de huidige stroom en wordt de positie binnen de stream verplaatst door het aantal gelezen bytes.

(Overgenomen van Stream)
ReadAsync(Byte[], Int32, Int32, CancellationToken)

Gegevens uit deze stroom worden asynchroon gelezen en opgeslagen in het opgegeven bereik van een bytematrix.

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

Asynchroon leest een reeks bytes uit de huidige stroom, verplaatst de positie binnen de stream door het aantal gelezen bytes en bewaakt annuleringsaanvragen.

(Overgenomen van Stream)
ReadAsync(Byte[], Int32, Int32)

Asynchroon leest een reeks bytes uit de huidige stroom en wordt de positie binnen de stream verplaatst door het aantal gelezen bytes.

(Overgenomen van Stream)
ReadAsync(Memory<Byte>, CancellationToken)

Gegevens uit deze stream worden asynchroon gelezen en opgeslagen in het opgegeven geheugenbereik.

ReadByte()

Hiermee leest u een byte uit de SslStream en wordt de positie binnen de stream met één byte gelezen of wordt -1 geretourneerd als aan het einde van de stream.

ReadByte()

Hiermee leest u een byte uit de stroom en wordt de positie binnen de stream met één byte vooruit gelezen of wordt -1 geretourneerd als aan het einde van de stream.

(Overgenomen van Stream)
Seek(Int64, SeekOrigin)

Gooit een NotSupportedException.

SetLength(Int64)

Hiermee stelt u de lengte van de onderliggende stroom in.

ShutdownAsync()

Hiermee wordt deze SslStream afgesloten.

ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

(Overgenomen van Object)
Write(Byte[], Int32, Int32)

Schrijf het opgegeven aantal s naar de onderliggende stroom met behulp van Bytede opgegeven buffer en offset.

Write(Byte[])

Hiermee schrijft u de opgegeven gegevens naar deze stream.

Write(ReadOnlySpan<Byte>)

Wanneer deze wordt overschreven in een afgeleide klasse, schrijft u een reeks bytes naar de huidige stroom en wordt de huidige positie binnen deze stroom verplaatst met het aantal geschreven bytes.

(Overgenomen van Stream)
WriteAsync(Byte[], Int32, Int32, CancellationToken)

Asynchroon schrijft gegevens naar de onderliggende stroom vanuit het opgegeven bereik van een bytematrix.

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

Asynchroon schrijft een reeks bytes naar de huidige stroom, verplaatst de huidige positie binnen deze stream door het aantal geschreven bytes en bewaakt annuleringsaanvragen.

(Overgenomen van Stream)
WriteAsync(Byte[], Int32, Int32)

Asynchroon schrijft een reeks bytes naar de huidige stroom en wordt de huidige positie binnen deze stroom verplaatst door het aantal geschreven bytes.

(Overgenomen van Stream)
WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

Asynchroon schrijft gegevens naar de onderliggende stroom vanuit een alleen-lezen bytegeheugenbereik.

WriteByte(Byte)

Hiermee schrijft u een byte naar de huidige positie in de stroom en wordt de positie binnen de stream met één byte vooruit.

(Overgenomen van Stream)

Extensiemethoden

Name Description
ConfigureAwait(IAsyncDisposable, Boolean)

Hiermee configureert u hoe wacht op de taken die worden geretourneerd op basis van een asynchroon wegwerp, worden uitgevoerd.

Van toepassing op

Zie ook