SslStream Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет поток, который служит для взаимодействия между клиентом и сервером и использует протокол безопасности SSL для проверки подлинности сервера и при необходимости клиента.
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
- Наследование
- Наследование
Примеры
В следующем примере кода показано создание TcpListener объекта , использующего SslStream класс для взаимодействия с клиентами.
#using <System.dll>
using namespace System;
using namespace System::Collections;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::Net::Security;
using namespace System::Security::Authentication;
using namespace System::Text;
using namespace System::Security::Cryptography::X509Certificates;
using namespace System::IO;
public ref class SslTcpServer sealed
{
private:
static X509Certificate^ serverCertificate = nullptr;
public:
// The certificate parameter specifies the name of the file
// containing the machine certificate.
static void RunServer( String^ certificate )
{
serverCertificate = X509Certificate::CreateFromCertFile( certificate );
// Create a TCP/IP (IPv4) socket and listen for incoming connections.
TcpListener^ listener = gcnew TcpListener( IPAddress::Any,5000 );
listener->Start();
while (true)
{
Console::WriteLine( L"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 = gcnew SslStream( client->GetStream(),false );
// Authenticate the server but don't require the client to authenticate.
try
{
sslStream->AuthenticateAsServer( serverCertificate, false, true );
// false == no client cert required; true == check cert revocation.
// 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( L"Waiting for client message..." );
String^ messageData = ReadMessage( sslStream );
Console::WriteLine( L"Received: {0}", messageData );
// Write a message to the client.
array<Byte>^message = Encoding::UTF8->GetBytes( L"Hello from the server.<EOF>" );
Console::WriteLine( L"Sending hello message." );
sslStream->Write( message );
}
catch ( AuthenticationException^ e )
{
Console::WriteLine( L"Exception: {0}", e->Message );
if ( e->InnerException != nullptr )
{
Console::WriteLine( L"Inner exception: {0}", e->InnerException->Message );
}
Console::WriteLine( L"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.
array<Byte>^buffer = gcnew array<Byte>(2048);
StringBuilder^ messageData = gcnew 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();
array<Char>^chars = gcnew array<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( L"<EOF>" ) != -1 )
{
break;
}
}
while ( bytes != 0 );
return messageData->ToString();
}
static void DisplaySecurityLevel( SslStream^ stream )
{
Console::WriteLine( L"Cipher: {0} strength {1}", stream->CipherAlgorithm, stream->CipherStrength );
Console::WriteLine( L"Hash: {0} strength {1}", stream->HashAlgorithm, stream->HashStrength );
Console::WriteLine( L"Key exchange: {0} strength {1}", stream->KeyExchangeAlgorithm, stream->KeyExchangeStrength );
Console::WriteLine( L"Protocol: {0}", stream->SslProtocol );
}
static void DisplaySecurityServices( SslStream^ stream )
{
Console::WriteLine( L"Is authenticated: {0} as server? {1}", stream->IsAuthenticated, stream->IsServer );
Console::WriteLine( L"IsSigned: {0}", stream->IsSigned );
Console::WriteLine( L"Is Encrypted: {0}", stream->IsEncrypted );
Console::WriteLine( L"Is mutually authenticated: {0}", stream->IsMutuallyAuthenticated );
}
static void DisplayStreamProperties( SslStream^ stream )
{
Console::WriteLine( L"Can read: {0}, write {1}", stream->CanRead, stream->CanWrite );
Console::WriteLine( L"Can timeout: {0}", stream->CanTimeout );
}
static void DisplayCertificateInformation( SslStream^ stream )
{
Console::WriteLine( L"Certificate revocation list checked: {0}", stream->CheckCertRevocationStatus );
X509Certificate^ localCertificate = stream->LocalCertificate;
if ( stream->LocalCertificate != nullptr )
{
Console::WriteLine( L"Local cert was issued to {0} and is valid from {1} until {2}.",
localCertificate->Subject,
localCertificate->GetEffectiveDateString(),
localCertificate->GetExpirationDateString() );
}
else
{
Console::WriteLine( L"Local certificate is null." );
}
X509Certificate^ remoteCertificate = stream->RemoteCertificate;
if ( stream->RemoteCertificate != nullptr )
{
Console::WriteLine( L"Remote cert was issued to {0} and is valid from {1} until {2}.",
remoteCertificate->Subject,
remoteCertificate->GetEffectiveDateString(),
remoteCertificate->GetExpirationDateString() );
}
else
{
Console::WriteLine( L"Remote certificate is null." );
}
}
private:
static void DisplayUsage()
{
Console::WriteLine( L"To start the server specify:" );
Console::WriteLine( L"serverSync certificateFile.cer" );
Environment::Exit( 1 );
}
public:
int RunServerASync()
{
array<String^>^args = Environment::GetCommandLineArgs();
String^ certificate = nullptr;
if ( args == nullptr || args->Length < 2 )
{
DisplayUsage();
}
certificate = args[ 1 ];
SslTcpServer::RunServer( certificate );
return 0;
}
};
int main(){
SslTcpServer^ sts = gcnew SslTcpServer();
sts->RunServerASync();
}
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
В следующем примере кода показано создание TcpClient класса , использующего SslStream класс для взаимодействия с сервером.
#using <System.dll>
#using <System.Security.dll>
using namespace System;
using namespace System::Collections;
using namespace System::Globalization;
using namespace System::Net;
using namespace System::Net::Security;
using namespace System::Net::Sockets;
using namespace System::Security::Authentication;
using namespace System::Text;
using namespace System::Security::Cryptography::X509Certificates;
using namespace System::IO;
namespace NlsClientSync
{
public ref class SslTcpClient
{
private:
static Hashtable^ certificateErrors = gcnew Hashtable;
// Load a table of errors that might cause
// the certificate authentication to fail.
static void InitializeCertificateErrors()
{
certificateErrors->Add(0x800B0101,
"The certification has expired.");
certificateErrors->Add(0x800B0104,
"A path length constraint "
"in the certification chain has been violated.");
certificateErrors->Add(0x800B0105,
"A certificate contains an unknown extension "
"that is marked critical.");
certificateErrors->Add(0x800B0107,
"A parent of a given certificate in fact "
"did not issue that child certificate.");
certificateErrors->Add(0x800B0108,
"A certificate is missing or has an empty value "
"for a necessary field.");
certificateErrors->Add(0x800B0109,
"The certificate root is not trusted.");
certificateErrors->Add(0x800B010C,
"The certificate has been revoked.");
certificateErrors->Add(0x800B010F,
"The name in the certificate does not not match "
"the host name requested by the client.");
certificateErrors->Add(0x800B0111,
"The certificate was explicitly marked "
"as untrusted by the user.");
certificateErrors->Add(0x800B0112,
"A certification chain processed correctly, "
"but one of the CA certificates is not trusted.");
certificateErrors->Add(0x800B0113,
"The certificate has an invalid policy.");
certificateErrors->Add(0x800B0114,
"The certificate name is either not "
"in the permitted list or is explicitly excluded.");
certificateErrors->Add(0x80092012,
"The revocation function was unable to check "
"revocation for the certificate.");
certificateErrors->Add(0x80090327,
"An unknown error occurred while "
"processing the certificate.");
certificateErrors->Add(0x80096001,
"A system-level error occurred "
"while verifying trust.");
certificateErrors->Add(0x80096002,
"The certificate for the signer of the message "
"is invalid or not found.");
certificateErrors->Add(0x80096003,
"One of the counter signatures was invalid.");
certificateErrors->Add(0x80096004,
"The signature of the certificate "
"cannot be verified.");
certificateErrors->Add(0x80096005,
"The time stamp signature or certificate "
"could not be verified or is malformed.");
certificateErrors->Add(0x80096010,
"The digital signature of the object "
"was not verified.");
certificateErrors->Add(0x80096019,
"The basic constraint extension of a certificate "
"has not been observed.");
}
static String^ CertificateErrorDescription(UInt32 problem)
{
// Initialize the error message dictionary
// if it is not yet available.
if (certificateErrors->Count == 0)
{
InitializeCertificateErrors();
}
String^ description = safe_cast<String^>(
certificateErrors[problem]);
if (description == nullptr)
{
description = String::Format(
CultureInfo::CurrentCulture,
"Unknown certificate error - 0x{0:x8}",
problem);
}
return description;
}
public:
// The following method is invoked
// by the CertificateValidationDelegate.
static bool ValidateServerCertificate(
Object^ sender,
X509Certificate^ certificate,
X509Chain^ chain,
SslPolicyErrors sslPolicyErrors)
{
Console::WriteLine("Validating the server certificate.");
if (sslPolicyErrors == SslPolicyErrors::None)
return true;
Console::WriteLine("Certificate error: {0}", sslPolicyErrors);
// Do not allow this client to communicate with unauthenticated servers.
return false;
}
static void RunClient(String^ machineName, String^ serverName)
{
// Create a TCP/IP client socket.
// machineName is the host running the server application.
TcpClient^ client = gcnew TcpClient(machineName, 5000);
Console::WriteLine("Client connected.");
// Create an SSL stream that will close
// the client's stream.
SslStream^ sslStream = gcnew SslStream(
client->GetStream(), false,
gcnew RemoteCertificateValidationCallback(ValidateServerCertificate),
nullptr);
// The server name must match the name
// on the server certificate.
try
{
sslStream->AuthenticateAsClient(serverName);
}
catch (AuthenticationException^ ex)
{
Console::WriteLine("Exception: {0}", ex->Message);
if (ex->InnerException != nullptr)
{
Console::WriteLine("Inner exception: {0}",
ex->InnerException->Message);
}
Console::WriteLine("Authentication failed - "
"closing the connection.");
sslStream->Close();
client->Close();
return;
}
// Encode a test message into a byte array.
// Signal the end of the message using the "<EOF>".
array<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.
sslStream->Close();
client->Close();
Console::WriteLine("Client closed.");
}
private:
static String^ ReadMessage(SslStream^ sslStream)
{
// Read the message sent by the server.
// The end of the message is signaled using the
// "<EOF>" marker.
array<Byte>^ buffer = gcnew array<Byte>(2048);
StringBuilder^ messageData = gcnew StringBuilder;
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Encoding^ u8 = Encoding::UTF8;
Decoder^ decoder = u8->GetDecoder();
int bytes = -1;
do
{
bytes = sslStream->Read(buffer, 0, buffer->Length);
array<__wchar_t>^ chars = gcnew array<__wchar_t>(
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();
}
};
}
int main()
{
array<String^>^ args = Environment::GetCommandLineArgs();
String^ serverCertificateName = nullptr;
String^ machineName = nullptr;
if (args == nullptr || args->Length < 2)
{
Console::WriteLine("To start the client specify:");
Console::WriteLine("clientSync machineName [serverName]");
return 1;
}
// User can specify the machine name and server name.
// Server name must match the name on
// the server's certificate.
machineName = args[1];
if (args->Length < 3)
{
serverCertificateName = machineName;
}
else
{
serverCertificateName = args[2];
};
NlsClientSync::SslTcpClient::RunClient(machineName,
serverCertificateName);
return 0;
}
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
Комментарии
Протоколы SSL помогают обеспечить проверку конфиденциальности и целостности сообщений, передаваемых с помощью SslStream. При передаче конфиденциальной информации между клиентом и сервером SslStreamследует использовать SSL-подключение, например предоставленное службой . SslStream Использование помогает предотвратить чтение и незаконное изменение информации во время ее передачи по сети.
Экземпляр SslStream передает данные с помощью потока, который предоставляется при создании SslStream. При предоставлении этого базового потока можно указать, закрывается ли при закрытии SslStream базового потока. Как правило, SslStream класс используется с классами TcpClient и TcpListener . Метод GetStream предоставляет объект , подходящий NetworkStream для использования с классом SslStream .
После создания SslStream, сервер и , при необходимости, клиент должен пройти проверку подлинности. Сервер должен предоставить сертификат X509, который подтверждает свою личность и может запросить, чтобы клиент также это делал. Проверка подлинности должна быть выполнена перед передачей SslStreamинформации с помощью . Клиенты инициируют проверку подлинности с помощью синхронных AuthenticateAsClient методов, которые блокируются до завершения проверки подлинности, или асинхронных BeginAuthenticateAsClient методов, которые не блокируют ожидание завершения проверки подлинности. Серверы инициируют проверку подлинности с помощью синхронных AuthenticateAsServer или асинхронных BeginAuthenticateAsServer методов. И клиент, и сервер должны инициировать проверку подлинности.
Проверка подлинности обрабатывается поставщиком канала службы поддержки безопасности (SSPI). Клиенту предоставляется возможность управлять проверкой сертификата сервера путем указания делегата RemoteCertificateValidationCallback при создании SslStream. Сервер также может управлять проверкой, предоставляя RemoteCertificateValidationCallback делегат. Метод, на который ссылается делегат, включает сертификат удаленной стороны и все ошибки SSPI, возникшие при проверке сертификата. Обратите внимание, что если сервер указывает делегат, метод делегата вызывается независимо от того, запрашивает ли сервер проверку подлинности клиента. Если сервер не запросил проверку подлинности клиента, метод делегата сервера получает пустой сертификат и пустой массив ошибок сертификата.
Если сервер требует проверки подлинности клиента, клиент должен указать один или несколько сертификатов для проверки подлинности. Если у клиента несколько сертификатов, клиент может предоставить LocalCertificateSelectionCallback делегата, чтобы выбрать правильный сертификат для сервера. Сертификаты клиента должны находиться в хранилище сертификатов "My" текущего пользователя. Проверка подлинности клиента с помощью сертификатов не поддерживается для Ssl2 протокола SSL версии 2.
Если проверка подлинности завершается сбоем AuthenticationException, вы получите , и SslStream больше не будет использоваться. Этот объект следует закрыть и удалить все ссылки на него, чтобы сборщик мусора смог собрать его.
Когда процесс проверки подлинности, также известный как подтверждение SSL, завершается успешно, устанавливается удостоверение сервера (и при необходимости клиента), и SslStream клиент может использоваться клиентом и сервером для обмена сообщениями. Перед отправкой или получением информации клиент и сервер должны проверка службы безопасности и уровни, предоставляемые SslStream , чтобы определить, соответствуют ли выбранные протоколы, алгоритмы и сильные стороны их требованиям к целостности и конфиденциальности. Если текущих параметров недостаточно, поток должен быть закрыт. Службы безопасности, предоставляемые SslStream , можно проверка с помощью IsEncrypted свойств и IsSigned . В следующей таблице показаны элементы, сообщающие о параметрах шифрования, используемых для проверки подлинности, шифрования и подписывания данных.
Элемент | Члены |
---|---|
Протокол безопасности, используемый для проверки подлинности сервера и, при необходимости, клиента. | Свойство SslProtocol и связанное SslProtocols перечисление. |
Алгоритм обмена ключами. | Свойство KeyExchangeAlgorithm и связанное ExchangeAlgorithmType перечисление. |
Алгоритм целостности сообщений. | Свойство HashAlgorithm и связанное HashAlgorithmType перечисление. |
Алгоритм конфиденциальности сообщений. | Свойство CipherAlgorithm и связанное CipherAlgorithmType перечисление. |
Сильные стороны выбранных алгоритмов. | Свойства KeyExchangeStrength, HashStrengthи CipherStrength . |
После успешной проверки подлинности можно отправлять данные с помощью синхронных Write или асинхронных BeginWrite методов. Вы можете получать данные с помощью синхронных Read или асинхронных BeginRead методов.
Если вы указали для SslStream , что базовый поток должен быть оставлен открытым, вы несете ответственность за закрытие этого потока после завершения его использования.
Примечание
Если приложение, создающее SslStream объект, выполняется с учетными данными обычного пользователя, оно не сможет получить доступ к сертификатам, установленным в хранилище локального компьютера, если пользователю не предоставлено явное разрешение на это.
SslStream предполагает, что время ожидания наряду с любым другим IOException , когда он возникает из внутреннего потока, будет рассматриваться вызывающим элементом как неустранимый. Повторное SslStream использовать экземпляр по истечении времени ожидания приведет к возврату мусора. В этих случаях приложение должно CloseSslStream вызывать исключение и .
В платформа .NET Framework 4.6 включена новая функция безопасности, которая блокирует небезопасные алгоритмы шифра и хэширования для подключений. Приложения, использующие TLS/SSL с помощью таких API, как HttpClient, HttpWebRequest, FTPClient, SmtpClient, SslStream и т. д., а также целевые платформа .NET Framework 4.6 по умолчанию получают более безопасное поведение.
Разработчики могут отказаться от такого поведения, чтобы поддерживать взаимодействие с существующими службами SSL3 или tls w/RC4. В этой статье объясняется, как изменить код, чтобы новое поведение было отключено.
В платформа .NET Framework 4.7 добавлены новые перегрузки для методов, которые проверяют подлинность SslStreams, которые не указывают версию TLS, но вместо этого используют версию TLS, определенную как системное значение по умолчанию в SCHANNEL. Используйте эти методы в приложении для последующего изменения значений по умолчанию по мере изменения рекомендуемых версий TLS с течением времени без необходимости перестраивать и повторно развертывать приложение.
См. также рекомендации по протоколу TLS с платформа .NET Framework.
Конструкторы
SslStream(Stream) |
Инициализирует новый экземпляр класса SslStream с использованием указанного объекта Stream. |
SslStream(Stream, Boolean) |
Инициализирует новый экземпляр класса SslStream, используя заданный поток Stream и параметр, указывающий поведение потока при закрытии. |
SslStream(Stream, Boolean, RemoteCertificateValidationCallback) |
Инициализирует новый экземпляр класса SslStream, используя заданный поток Stream, параметр, указывающий поведение потока при закрытии, и делегат проверки сертификата. |
SslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback) |
Инициализирует новый экземпляр класса SslStream, используя заданный поток Stream, параметр, указывающий поведение потока при закрытии, делегат проверки сертификата и делегат выбора сертификата. |
SslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback, EncryptionPolicy) |
Инициализирует новый экземпляр класса SslStream с использованием указанного объекта Stream. |
Свойства
CanRead |
Возвращает значение типа Boolean, указывающее, разрешено ли чтение из базового потока. |
CanSeek |
Возвращает значение типа Boolean, указывающее, разрешен ли поиск в базовом потоке. |
CanTimeout |
Возвращает значение типа Boolean, указывающее, поддерживает ли базовый поток использование времени ожидания. |
CanWrite |
Возвращает значение типа Boolean, указывающее, разрешена ли запись в базовый поток. |
CheckCertRevocationStatus |
Возвращает значение типа Boolean, указывающее, проверяется ли список отзыва сертификатов во время процесса проверки сертификатов. |
CipherAlgorithm |
Возвращает значение, указывающее алгоритм массового шифрования, используемый данным потоком SslStream. |
CipherStrength |
Возвращает значение, указывающее стойкость алгоритма шифрования, используемого этим потоком SslStream. |
HashAlgorithm |
Возвращает алгоритм, используемый для генерирования кодов проверки подлинности сообщений (MAC). |
HashStrength |
Возвращает значение, указывающее стойкость алгоритма хэширования, используемого данным экземпляром. |
InnerStream |
Возвращает поток, используемый данным объектом AuthenticatedStream для отправки и получения данных. (Унаследовано от AuthenticatedStream) |
IsAuthenticated |
Возвращает значение типа Boolean, указывающее, была ли проверка подлинности успешной. |
IsEncrypted |
Возвращает значение типа Boolean, указывающее, использует ли данный поток SslStream шифрование данных. |
IsMutuallyAuthenticated |
Возвращает значение типа Boolean, указывающее, была ли проведена проверка подлинности как для сервера, так и для клиента. |
IsServer |
Возвращает значение типа Boolean, указывающее, прошла ли локальная сторона соединения, используемого данным потоком SslStream, проверку подлинности как сервер. |
IsSigned |
Возвращает значение типа Boolean, указывающее, подписаны ли данные, отправленные с помощью данного потока. |
KeyExchangeAlgorithm |
Возвращает алгоритм обмена ключами, используемый данным потоком SslStream. |
KeyExchangeStrength |
Возвращает значение, указывающее стойкость алгоритма обмена ключами, используемого данным экземпляром. |
LeaveInnerStreamOpen |
Возвращает значение, определяющее, оставлен ли открытым поток, используемый данным объектом AuthenticatedStream для отправки и получения данных. (Унаследовано от AuthenticatedStream) |
Length |
Возвращает длину данных в базовом потоке. |
LocalCertificate |
Возвращает сертификат, используемый для проверки подлинности локальной конечной точки. |
NegotiatedApplicationProtocol |
Протокол приложения, согласованный при подтверждении TLS. |
NegotiatedCipherSuite |
Возвращает набор шифров, который был согласован для этого соединения. |
Position |
Возвращает или задает текущую позицию в базовом потоке. |
ReadTimeout |
Возвращает или задает время (в миллисекундах), в течение которого операция чтения блокирует ожидание данных. |
RemoteCertificate |
Возвращает сертификат, используемый для проверки подлинности удаленной конечной точки. |
SslProtocol |
Возвращает значение, указывающее протокол безопасности, используемый для проверки подлинности в данном соединении. |
TargetHostName |
Возвращает имя сервера, к которому пытается подключиться клиент. Это имя используется для проверки сертификата сервера. Это может быть DNS-имя или IP-адрес. |
TransportContext |
Получает объект TransportContext, который используется для проверки подлинности с использованием расширенной защиты. |
WriteTimeout |
Возвращает или задает период времени, в течение которого операция записи блокирует выполнение, ожидая данных. |
Методы
AuthenticateAsClient(SslClientAuthenticationOptions) |
Вызывается клиентами для проверки подлинности сервера и, при необходимости, клиента в подключении "клиент-сервер". |
AuthenticateAsClient(String) |
Вызывается клиентами для проверки подлинности сервера и, при необходимости, клиента в подключении "клиент-сервер". |
AuthenticateAsClient(String, X509CertificateCollection, Boolean) |
Вызывается клиентами для проверки подлинности сервера и, при необходимости, клиента в подключении "клиент-сервер". Процесс проверки подлинности использует указанную коллекцию сертификатов и протокол SSL системы по умолчанию. |
AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean) |
Вызывается клиентами для проверки подлинности сервера и, при необходимости, клиента в подключении "клиент-сервер". Процесс проверки подлинности использует заданную коллекцию сертификатов и протокол SSL. |
AuthenticateAsClientAsync(SslClientAuthenticationOptions, CancellationToken) |
Вызывается клиентами для проверки подлинности сервера и, при необходимости, клиента в подключении "клиент-сервер" в рамках асинхронной операции. В процессе проверки подлинности используются сведения, указанные в контейнере свойств |
AuthenticateAsClientAsync(String) |
Вызывается клиентами для проверки подлинности сервера и, при необходимости, клиента в подключении "клиент-сервер" в рамках асинхронной операции. |
AuthenticateAsClientAsync(String, X509CertificateCollection, Boolean) |
Вызывается клиентами для проверки подлинности сервера и, при необходимости, клиента в подключении "клиент-сервер" в рамках асинхронной операции. Процесс проверки подлинности использует указанную коллекцию сертификатов и протокол SSL системы по умолчанию. |
AuthenticateAsClientAsync(String, X509CertificateCollection, SslProtocols, Boolean) |
Вызывается клиентами для проверки подлинности сервера и, при необходимости, клиента в подключении "клиент-сервер" в рамках асинхронной операции. Процесс проверки подлинности использует заданную коллекцию сертификатов и протокол SSL. |
AuthenticateAsServer(SslServerAuthenticationOptions) |
Вызывается серверами для проверки подлинности сервера и, при необходимости, клиента в соединении клиент-сервер с использованием заданного сертификата. |
AuthenticateAsServer(X509Certificate) |
Вызывается серверами для проверки подлинности сервера и, при необходимости, клиента в соединении клиент-сервер с использованием заданного сертификата. |
AuthenticateAsServer(X509Certificate, Boolean, Boolean) |
Вызывается серверами для проверки подлинности сервера и (при необходимости) клиента в подключении между клиентом и сервером с использованием указанных сертификатов, требований и протокола безопасности системы по умолчанию. |
AuthenticateAsServer(X509Certificate, Boolean, SslProtocols, Boolean) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента в подключении между клиентом и сервером с использованием указанных сертификатов, требований и протокола безопасности. |
AuthenticateAsServerAsync(ServerOptionsSelectionCallback, Object, CancellationToken) |
Вызывается серверами аутентификации сервера, и, при необходимости, клиента в соединении клиент-сервер как асинхронная операция. Процесс аутентификации использует сведения, возвращаемые |
AuthenticateAsServerAsync(SslServerAuthenticationOptions, CancellationToken) |
Вызывается серверами аутентификации сервера, и, при необходимости, клиента в соединении клиент-сервер как асинхронная операция. В процессе проверки подлинности используются сведения, указанные в контейнере свойств |
AuthenticateAsServerAsync(X509Certificate) |
Вызывается серверами для проверки подлинности сервера и, при необходимости, клиента в соединении клиент-сервер с использованием заданного сертификата как асинхронная операция. |
AuthenticateAsServerAsync(X509Certificate, Boolean, Boolean) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента при подключении между клиентом и сервером с использованием указанных сертификатов, требований и протокола безопасности в рамках асинхронной операции. |
AuthenticateAsServerAsync(X509Certificate, Boolean, SslProtocols, Boolean) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента при подключении между клиентом и сервером с использованием указанных сертификатов, требований и протокола безопасности в рамках асинхронной операции. |
BeginAuthenticateAsClient(String, AsyncCallback, Object) |
Вызывается клиентами для запуска асинхронной операции проверки подлинности сервера и, при необходимости, клиента. |
BeginAuthenticateAsClient(String, X509CertificateCollection, Boolean, AsyncCallback, Object) |
Вызывается клиентами для запуска асинхронной операции проверки подлинности сервера и (при необходимости) клиента с использованием указанных сертификатов и протокола безопасности системы по умолчанию. |
BeginAuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean, AsyncCallback, Object) |
Вызывается клиентами для запуска асинхронной операции проверки подлинности сервера, и, при необходимости, клиента с использованием указанных сертификатов и протокола безопасности. |
BeginAuthenticateAsServer(X509Certificate, AsyncCallback, Object) |
Вызывается серверами для начала асинхронной операции проверки подлинности клиента, и, при необходимости, сервера в соединении клиент-сервер. |
BeginAuthenticateAsServer(X509Certificate, Boolean, Boolean, AsyncCallback, Object) |
Вызывается серверами для запуска асинхронной операции проверки подлинности сервера и (при необходимости) клиента с использованием указанных сертификатов, требований и протокола безопасности системы по умолчанию. |
BeginAuthenticateAsServer(X509Certificate, Boolean, SslProtocols, Boolean, AsyncCallback, Object) |
Вызывается серверами для запуска асинхронной операции проверки подлинности сервера и (при необходимости) клиента с использованием указанных сертификатов, требований и протокола безопасности. |
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) |
Начинает асинхронную операцию чтения, которая считывает данные из потока и сохраняет их в заданном массиве. |
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) |
Начинает операцию асинхронного чтения. (Рекомендуется использовать ReadAsync(Byte[], Int32, Int32).) (Унаследовано от Stream) |
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) |
Начинает асинхронную операцию записи, которая записывает байты (Byte) из указанного буфера в поток. |
BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) |
Начинает операцию асинхронной записи. (Рекомендуется использовать WriteAsync(Byte[], Int32, Int32).) (Унаследовано от Stream) |
Close() |
Закрывает текущий поток и отключает все ресурсы (например, сокеты и файловые дескрипторы), связанные с текущим потоком. Вместо вызова данного метода, убедитесь в том, что поток надлежащим образом ликвидирован. (Унаследовано от Stream) |
CopyTo(Stream) |
Считывает байты из текущего потока и записывает их в другой поток. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyTo(Stream, Int32) |
Считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyToAsync(Stream) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyToAsync(Stream, CancellationToken) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный токен отмены. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyToAsync(Stream, Int32) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CopyToAsync(Stream, Int32, CancellationToken) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера и токен отмены. Обе позиции потоков перемещаются по количеству скопированных байтов. (Унаследовано от Stream) |
CreateObjRef(Type) |
Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом. (Унаследовано от MarshalByRefObject) |
CreateWaitHandle() |
Устаревшие..
Устаревшие..
Устаревшие..
Выделяет объект WaitHandle. (Унаследовано от Stream) |
Dispose() |
Освобождает все ресурсы, занятые модулем Stream. (Унаследовано от Stream) |
Dispose(Boolean) |
Освобождает неуправляемые ресурсы, используемые объектом SslStream, а при необходимости освобождает также управляемые ресурсы. |
Dispose(Boolean) |
Освобождает неуправляемые ресурсы, используемые объектом AuthenticatedStream, а при необходимости освобождает также управляемые ресурсы. (Унаследовано от AuthenticatedStream) |
DisposeAsync() |
Асинхронно освобождает неуправляемые и управляемые ресурсы, используемые классом SslStream. |
DisposeAsync() |
Асинхронно освобождает неуправляемые и управляемые ресурсы, используемые классом AuthenticatedStream. (Унаследовано от AuthenticatedStream) |
EndAuthenticateAsClient(IAsyncResult) |
Завершает находящуюся в состоянии ожидания асинхронную операцию проверки подлинности сервера, которая была до этого запущена вызовом метода BeginAuthenticateAsClient. |
EndAuthenticateAsServer(IAsyncResult) |
Завершает находящуюся в состоянии ожидания асинхронную операцию проверки подлинности клиента, которая была до этого запущена вызовом метода BeginAuthenticateAsClient. |
EndRead(IAsyncResult) |
Заканчивает асинхронную операцию чтения, запущенную до этого вызовом метода BeginRead(Byte[], Int32, Int32, AsyncCallback, Object). |
EndRead(IAsyncResult) |
Ожидает завершения отложенного асинхронного чтения. (Рекомендуется использовать ReadAsync(Byte[], Int32, Int32).) (Унаследовано от Stream) |
EndWrite(IAsyncResult) |
Завершает асинхронную операцию записи, запущенную до этого вызовом метода BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object). |
EndWrite(IAsyncResult) |
Заканчивает операцию асинхронной записи. (Рекомендуется использовать WriteAsync(Byte[], Int32, Int32).) (Унаследовано от Stream) |
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
Finalize() |
Освобождает все ресурсы, занятые модулем SslStream. |
Flush() |
Принудительно записывает все буферизированные данные в базовое устройство. |
FlushAsync() |
Асинхронно очищает все буферы для этого потока и вызывает запись всех буферизованных данных в базовое устройство. (Унаследовано от Stream) |
FlushAsync(CancellationToken) |
Асинхронно записывает все буферизированные данные на базовое устройство. |
FlushAsync(CancellationToken) |
Асинхронно очищает все буферы данного потока, вызывает запись буферизованных данных в базовое устройство и отслеживает запросы отмены. (Унаследовано от Stream) |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetLifetimeService() |
Устаревшие..
Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра. (Унаследовано от MarshalByRefObject) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
InitializeLifetimeService() |
Устаревшие..
Получает объект службы времени существования для управления политикой времени существования для этого экземпляра. (Унаследовано от MarshalByRefObject) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
MemberwiseClone(Boolean) |
Создает неполную копию текущего объекта MarshalByRefObject. (Унаследовано от MarshalByRefObject) |
NegotiateClientCertificateAsync(CancellationToken) |
Согласовывает сертификат клиента для подключения, прошедшего проверку подлинности. |
ObjectInvariant() |
Устаревшие..
Обеспечивает поддержку для Contract. (Унаследовано от Stream) |
Read(Byte[], Int32, Int32) |
Считывает данные из этого потока и сохраняет их в заданном массиве. |
Read(Span<Byte>) |
При переопределении в производном классе считывает последовательность байтов из текущего потока и перемещает позицию в потоке на число считанных байтов. (Унаследовано от Stream) |
ReadAsync(Byte[], Int32, Int32) |
Асинхронно считывает последовательность байтов из текущего потока и перемещает позицию внутри потока на число считанных байтов. (Унаследовано от Stream) |
ReadAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно считывает данные из этого потока и сохраняет их в заданном диапазоне массива байтов. |
ReadAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно считывает последовательность байтов из текущего потока, перемещает позицию в потоке на число считанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
ReadAsync(Memory<Byte>, CancellationToken) |
Асинхронно считывает данные из этого потока и сохраняет их в заданном диапазоне памяти. |
ReadAsync(Memory<Byte>, CancellationToken) |
Асинхронно считывает последовательность байтов из текущего потока, перемещает позицию в потоке на число считанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
ReadAtLeast(Span<Byte>, Int32, Boolean) |
Считывает по крайней мере минимальное количество байтов из текущего потока и перемещает позицию в потоке на число прочитанных байтов. (Унаследовано от Stream) |
ReadAtLeastAsync(Memory<Byte>, Int32, Boolean, CancellationToken) |
Асинхронно считывает по крайней мере минимальное количество байтов из текущего потока, перемещает позицию в потоке на число прочитанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
ReadByte() |
Считывает байт из SslStream и перемещает позицию в потоке на один байт или возвращает –1, если достигнут конец потока. |
ReadByte() |
Считывает байт из потока и перемещает позицию в потоке на один байт или возвращает -1, если достигнут конец потока. (Унаследовано от Stream) |
ReadExactly(Byte[], Int32, Int32) |
Считывает |
ReadExactly(Span<Byte>) |
Считывает байты из текущего потока и перемещает позицию в потоке |
ReadExactlyAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно считывает |
ReadExactlyAsync(Memory<Byte>, CancellationToken) |
Асинхронно считывает байты из текущего потока, перемещает позицию в потоке |
Seek(Int64, SeekOrigin) |
Создает исключение NotSupportedException. |
SetLength(Int64) |
Задает длину данных в базовом потоке. |
ShutdownAsync() |
Завершает работу этого класса SslStream. |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
Write(Byte[]) |
Записывает в этот поток указанные данные. |
Write(Byte[], Int32, Int32) |
Записывает указанное количество элементов Byte в базовый поток, используя заданный буфер (параметр buffer) и начальное расположение (параметр offset). |
Write(ReadOnlySpan<Byte>) |
При переопределении в производном классе записывает последовательность байтов в текущий поток и перемещает текущую позицию в нем вперед на число записанных байтов. (Унаследовано от Stream) |
WriteAsync(Byte[], Int32, Int32) |
Асинхронно записывает последовательность байтов в текущий поток и перемещает текущую позицию внутри потока на число записанных байтов. (Унаследовано от Stream) |
WriteAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно записывает данные в базовый поток из заданного диапазона массива байтов. |
WriteAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию внутри потока на число записанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
WriteAsync(ReadOnlyMemory<Byte>, CancellationToken) |
Асинхронно записывает данные в базовый поток из диапазона памяти байтов только для чтения. |
WriteAsync(ReadOnlyMemory<Byte>, CancellationToken) |
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию внутри потока на число записанных байтов и отслеживает запросы отмены. (Унаследовано от Stream) |
WriteByte(Byte) |
Записывает байт в текущее положение в потоке и перемещает позицию в потоке вперед на один байт. (Унаследовано от Stream) |
Методы расширения
CopyToAsync(Stream, PipeWriter, CancellationToken) |
Асинхронно считывает байты из Stream и записывает их в указанный PipeWriter, используя токен отмены. |
ConfigureAwait(IAsyncDisposable, Boolean) |
Настраивает способ выполнения ожиданий для задач, возвращаемых из асинхронного высвобождаемого объекта. |
Применяется к
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по