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;
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;
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протокола SSL. SSL-подключение, например предоставленное SslStream, должно использоваться при обмене конфиденциальной информацией между клиентом и сервером. 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 и IsSigned свойстваIsEncrypted. В следующей таблице показаны элементы, которые сообщают о параметрах шифрования, используемых для проверки подлинности, шифрования и подписывания данных.
| Элемент | Члены |
|---|---|
| Протокол безопасности, используемый для проверки подлинности сервера и, при необходимости, клиента. | SslProtocol Свойство и связанное SslProtocols перечисление. |
| Алгоритм обмена ключами. | KeyExchangeAlgorithm Свойство и связанное ExchangeAlgorithmType перечисление. |
| Алгоритм целостности сообщений. | HashAlgorithm Свойство и связанное HashAlgorithmType перечисление. |
| Алгоритм конфиденциальности сообщений. | CipherAlgorithm Свойство и связанное CipherAlgorithmType перечисление. |
| Сильные стороны выбранных алгоритмов. | , KeyExchangeStrengthHashStrengthа также 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, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback, EncryptionPolicy) |
Инициализирует новый экземпляр класса с помощью указанного SslStreamStream. |
| SslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback) |
Инициализирует новый экземпляр класса, используя указанное Streamповедение закрытия потока, делегат проверки сертификатов SslStream и делегат выбора сертификатов. |
| SslStream(Stream, Boolean, RemoteCertificateValidationCallback) |
Инициализирует новый экземпляр SslStream класса, используя указанное Streamповедение закрытия потока и делегат проверки сертификатов. |
| SslStream(Stream, Boolean) |
Инициализирует новый экземпляр класса с помощью указанного SslStreamStream и режима закрытия потока. |
| SslStream(Stream) |
Инициализирует новый экземпляр класса с помощью указанного SslStreamStream. |
Свойства
| Имя | Описание |
|---|---|
| CanRead |
Boolean Возвращает значение, указывающее, доступен ли базовый поток для чтения. |
| CanSeek |
Boolean Возвращает значение, указывающее, можно ли искать базовый поток. |
| CanTimeout |
Возвращает значение, указывающее, поддерживает ли базовый Boolean поток время ожидания. |
| CanWrite |
Boolean Возвращает значение, указывающее, является ли базовый поток записываемым. |
| CheckCertRevocationStatus |
Boolean Возвращает значение, указывающее, проверяется ли список отзыва сертификата во время процесса проверки сертификата. |
| CipherAlgorithm |
Устаревшие..
Возвращает значение, определяющее алгоритм массового шифрования, используемый этим SslStreamметодом. |
| CipherStrength |
Устаревшие..
Возвращает значение, определяющее силу алгоритма шифра, используемого этим алгоритмом SslStream. |
| HashAlgorithm |
Устаревшие..
Возвращает алгоритм, используемый для создания кодов проверки подлинности сообщений (MACs). |
| 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, X509CertificateCollection, Boolean) |
Вызывается клиентами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу. Процесс проверки подлинности использует указанную коллекцию сертификатов и протокол SSL по умолчанию по умолчанию. |
| AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean) |
Вызывается клиентами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу. Процесс проверки подлинности использует указанную коллекцию сертификатов и протокол SSL. |
| AuthenticateAsClient(String) |
Вызывается клиентами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу. |
| AuthenticateAsClientAsync(SslClientAuthenticationOptions, CancellationToken) |
Вызывается клиентами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу в качестве асинхронной операции. В процессе проверки подлинности используются сведения, указанные в контейнере |
| AuthenticateAsClientAsync(String, X509CertificateCollection, Boolean) |
Вызывается клиентами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу в качестве асинхронной операции. Процесс проверки подлинности использует указанную коллекцию сертификатов и протокол SSL по умолчанию по умолчанию. |
| AuthenticateAsClientAsync(String, X509CertificateCollection, SslProtocols, Boolean) |
Вызывается клиентами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу в качестве асинхронной операции. Процесс проверки подлинности использует указанную коллекцию сертификатов и протокол SSL. |
| AuthenticateAsClientAsync(String) |
Вызывается клиентами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу в качестве асинхронной операции. |
| AuthenticateAsServer(SslServerAuthenticationOptions) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу с помощью указанного сертификата. |
| AuthenticateAsServer(X509Certificate, Boolean, Boolean) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу с использованием указанных сертификатов и требований и использования системного протокола безопасности по умолчанию. |
| AuthenticateAsServer(X509Certificate, Boolean, SslProtocols, Boolean) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента в соединении с клиентским сервером с использованием указанных сертификатов, требований и протокола безопасности. |
| AuthenticateAsServer(X509Certificate) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу с помощью указанного сертификата. |
| AuthenticateAsServerAsync(ServerOptionsSelectionCallback, Object, CancellationToken) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу в качестве асинхронной операции. В процессе проверки подлинности используются сведения, возвращаемые |
| AuthenticateAsServerAsync(SslServerAuthenticationOptions, CancellationToken) |
Выполняет проверку подлинности сервера и при необходимости клиента в подключении к клиентскому серверу в качестве асинхронной операции. В процессе проверки подлинности используются сведения, указанные в контейнере |
| AuthenticateAsServerAsync(X509Certificate, Boolean, Boolean) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу с использованием указанных сертификатов, требований и протокола безопасности в качестве асинхронной операции. |
| AuthenticateAsServerAsync(X509Certificate, Boolean, SslProtocols, Boolean) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу с использованием указанных сертификатов, требований и протокола безопасности в качестве асинхронной операции. |
| AuthenticateAsServerAsync(X509Certificate) |
Вызывается серверами для проверки подлинности сервера и при необходимости клиента в подключении к клиентскому серверу с использованием указанного сертификата в качестве асинхронной операции. |
| 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) |
Начинает асинхронную операцию чтения, которая считывает данные из потока и сохраняет ее в указанном массиве. |
| BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) |
Начинает асинхронную операцию записи, которая записывает Byteданные из указанного буфера в поток. |
| Close() |
Закрывает текущий поток и освобождает все ресурсы (например, сокеты и дескрипторы файлов), связанные с текущим потоком. Вместо вызова этого метода убедитесь, что поток правильно удален. (Унаследовано от Stream) |
| CopyTo(Stream, Int32) |
Считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера. Обе позиции потоков расширены по количеству скопированных байтов. (Унаследовано от Stream) |
| CopyTo(Stream) |
Считывает байты из текущего потока и записывает их в другой поток. Обе позиции потоков расширены по количеству скопированных байтов. (Унаследовано от Stream) |
| CopyToAsync(Stream, CancellationToken) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток с помощью указанного маркера отмены. Обе позиции потоков расширены по количеству скопированных байтов. (Унаследовано от Stream) |
| CopyToAsync(Stream, Int32, CancellationToken) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера и маркер отмены. Обе позиции потоков расширены по количеству скопированных байтов. (Унаследовано от Stream) |
| CopyToAsync(Stream, Int32) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера. Обе позиции потоков расширены по количеству скопированных байтов. (Унаследовано от Stream) |
| CopyToAsync(Stream) |
Асинхронно считывает байты из текущего потока и записывает их в другой поток. Обе позиции потоков расширены по количеству скопированных байтов. (Унаследовано от Stream) |
| CreateObjRef(Type) |
Создает объект, содержащий все соответствующие сведения, необходимые для создания прокси-сервера, используемого для взаимодействия с удаленным объектом. (Унаследовано от MarshalByRefObject) |
| CreateWaitHandle() |
Устаревшие..
Устаревшие..
Устаревшие..
WaitHandle Выделяет объект. (Унаследовано от Stream) |
| Dispose() |
Освобождает все ресурсы, используемые параметром Stream. (Унаследовано от Stream) |
| Dispose(Boolean) |
Освобождает неуправляемые ресурсы, используемые SslStream и при необходимости освобождает управляемые ресурсы. |
| Dispose(Boolean) |
Освобождает неуправляемые ресурсы, используемые AuthenticatedStream и при необходимости освобождает управляемые ресурсы. (Унаследовано от AuthenticatedStream) |
| DisposeAsync() |
Асинхронно освобождает неуправляемые и управляемые ресурсы, используемые в .SslStream |
| EndAuthenticateAsClient(IAsyncResult) |
Завершает ожидающая асинхронная операция проверки подлинности сервера, запущенная с предыдущего вызова BeginAuthenticateAsClient. |
| EndAuthenticateAsServer(IAsyncResult) |
Заканчивается ожидающая асинхронная операция проверки подлинности клиента, запущенная с предыдущего вызова BeginAuthenticateAsClient. |
| EndRead(IAsyncResult) |
Завершает асинхронную операцию чтения, запущенную с предыдущего вызова BeginRead(Byte[], Int32, Int32, AsyncCallback, Object). |
| EndWrite(IAsyncResult) |
Завершает асинхронную операцию записи, запущенную с предыдущего вызова BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object). |
| 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>) |
При переопределении в производном классе считывает последовательность байтов из текущего потока и перемещает положение в потоке по количеству байтов, считываемых. |
| Read(Span<Byte>) |
При переопределении в производном классе считывает последовательность байтов из текущего потока и перемещает положение в потоке по количеству байтов, считываемых. (Унаследовано от Stream) |
| ReadAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно считывает данные из этого потока и сохраняет его в указанном диапазоне массива байтов. |
| ReadAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно считывает последовательность байтов из текущего потока, перемещает положение в потоке по количеству операций чтения байтов и отслеживает запросы на отмену. (Унаследовано от Stream) |
| ReadAsync(Byte[], Int32, Int32) |
Асинхронно считывает последовательность байтов из текущего потока и перемещает позицию в потоке по числу байтов. (Унаследовано от 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[], Int32, Int32) |
Запишите указанное число s в Byteбазовый поток с помощью указанного буфера и смещения. |
| Write(Byte[]) |
Записывает указанные данные в этот поток. |
| Write(ReadOnlySpan<Byte>) |
При переопределении в производном классе записывает последовательность байтов в текущий поток и перемещает текущую позицию в этом потоке по количеству записанных байтов. |
| Write(ReadOnlySpan<Byte>) |
При переопределении в производном классе записывает последовательность байтов в текущий поток и перемещает текущую позицию в этом потоке по количеству записанных байтов. (Унаследовано от Stream) |
| WriteAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно записывает данные в базовый поток из указанного диапазона массива байтов. |
| WriteAsync(Byte[], Int32, Int32, CancellationToken) |
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию в этом потоке по количеству записанных байтов и отслеживает запросы на отмену. (Унаследовано от Stream) |
| WriteAsync(Byte[], Int32, Int32) |
Асинхронно записывает последовательность байтов в текущий поток и перемещает текущую позицию в этом потоке по количеству записанных байтов. (Унаследовано от Stream) |
| WriteAsync(ReadOnlyMemory<Byte>, CancellationToken) |
Асинхронно записывает данные в базовый поток из диапазона памяти только для чтения. |
| WriteAsync(ReadOnlyMemory<Byte>, CancellationToken) |
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию в этом потоке по количеству записанных байтов и отслеживает запросы на отмену. (Унаследовано от Stream) |
| WriteByte(Byte) |
Записывает байт в текущую позицию в потоке и перемещает позицию в потоке по одному байту. |
| WriteByte(Byte) |
Записывает байт в текущую позицию в потоке и перемещает позицию в потоке по одному байту. (Унаследовано от Stream) |
Методы расширения
| Имя | Описание |
|---|---|
| ConfigureAwait(IAsyncDisposable, Boolean) |
Настраивает способ ожидания задач, возвращаемых из асинхронного удаления. |
| CopyToAsync(Stream, PipeWriter, CancellationToken) |
Асинхронно считывает байты из Stream указанных и записывает их в указанный PipeWriterмаркер отмены. |