この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

SslStream クラス

 

公開日: 2016年10月

Secure Socket Layer (SSL) セキュリティ プロトコルを使用し、サーバーと、オプションでクライアントを認証するクライアント サーバー通信に使用されるストリームを提供します。

名前空間:   System.Net.Security
アセンブリ:  System (System.dll 内)

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

public class SslStream : AuthenticatedStream

名前説明
System_CAPS_pubmethodSslStream(Stream)

SslStream を指定して Stream クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodSslStream(Stream, Boolean)

新しいインスタンスを初期化、 SslStream クラスの指定して Stream およびクロージャの動作をストリーミングします。

System_CAPS_pubmethodSslStream(Stream, Boolean, RemoteCertificateValidationCallback)

新しいインスタンスを初期化、 SslStream クラスの指定して Stream, ストリームのクロージャの動作、および証明書の検証のデリゲート。

System_CAPS_pubmethodSslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback)

新しいインスタンスを初期化、 SslStream クラスの指定して Stream, 、クロージャの動作、証明書検証デリゲート、および証明書の選択のデリゲートをストリーム配信します。

System_CAPS_pubmethodSslStream(Stream, Boolean, RemoteCertificateValidationCallback, LocalCertificateSelectionCallback, EncryptionPolicy)

新しいインスタンスを初期化、 SslStream クラスの指定 Stream

名前説明
System_CAPS_pubpropertyCanRead

取得、 Boolean を基になるストリームが読み取り可能かどうかを示す値。(Stream.CanRead をオーバーライドします。)

System_CAPS_pubpropertyCanSeek

取得、 Boolean を基になるストリームがシーク可能かどうかを示す値。(Stream.CanSeek をオーバーライドします。)

System_CAPS_pubpropertyCanTimeout

取得、 Boolean を基になるストリームがタイムアウトをサポートしているかどうかを示す値。(Stream.CanTimeout をオーバーライドします。)

System_CAPS_pubpropertyCanWrite

取得、 Boolean を基になるストリームが書き込み可能かどうかを示す値。(Stream.CanWrite をオーバーライドします。)

System_CAPS_pubpropertyCheckCertRevocationStatus

取得、 Boolean 証明書の検証プロセス中に証明書失効リストをチェックするかどうかを示す値。

System_CAPS_pubpropertyCipherAlgorithm

これで使用される一括暗号化アルゴリズムを示す値を取得 SslStreamします。

System_CAPS_pubpropertyCipherStrength

これで使用される暗号アルゴリズムの強さを示す値を取得 SslStreamします。

System_CAPS_pubpropertyHashAlgorithm

メッセージ認証コード (Mac) を生成に使用されるアルゴリズムを取得します。

System_CAPS_pubpropertyHashStrength

このインスタンスで使用されるハッシュ アルゴリズムの強さを示す値を取得します。

System_CAPS_protpropertyInnerStream

使用されるストリームを取得して AuthenticatedStream データを送受信するためです。(AuthenticatedStream から継承されます。)

System_CAPS_pubpropertyIsAuthenticated

取得、 Boolean 認証が成功したかどうかを示す値。(AuthenticatedStream.IsAuthenticated をオーバーライドします。)

System_CAPS_pubpropertyIsEncrypted

取得、 Boolean を示す値かどうかこの SslStream データの暗号化を使用します。(AuthenticatedStream.IsEncrypted をオーバーライドします。)

System_CAPS_pubpropertyIsMutuallyAuthenticated

取得、 Boolean サーバーおよびクライアントが認証済みかどうかを示す値。(AuthenticatedStream.IsMutuallyAuthenticated をオーバーライドします。)

System_CAPS_pubpropertyIsServer

取得、 Boolean このローカル側の接続を使用するかどうかを示す値 SslStream サーバーとして認証されました。(AuthenticatedStream.IsServer をオーバーライドします。)

System_CAPS_pubpropertyIsSigned

取得、 Boolean をこのストリームを使用して送信されるデータが署名されているかどうかを示す値。(AuthenticatedStream.IsSigned をオーバーライドします。)

System_CAPS_pubpropertyKeyExchangeAlgorithm

使用されるキー交換アルゴリズムを取得 SslStreamします。

System_CAPS_pubpropertyKeyExchangeStrength

このインスタンスで使用されるキー交換アルゴリズムの強さを示す値を取得します。

System_CAPS_pubpropertyLeaveInnerStreamOpen

これで、ストリームが使用されるかどうかを取得 AuthenticatedStream のデータの送受信が開いたままになっています。(AuthenticatedStream から継承されます。)

System_CAPS_pubpropertyLength

基になるストリームの長さを取得します。(Stream.Length をオーバーライドします。)

System_CAPS_pubpropertyLocalCertificate

ローカル エンドポイントの認証に使用する証明書を取得します。

System_CAPS_pubpropertyPosition

取得または基になるストリームの現在の位置を設定します。(Stream.Position をオーバーライドします。)

System_CAPS_pubpropertyReadTimeout

取得または読み取り操作がブロックのデータ待機時間を設定します。(Stream.ReadTimeout をオーバーライドします。)

System_CAPS_pubpropertyRemoteCertificate

リモート エンドポイントの認証に使用する証明書を取得します。

System_CAPS_pubpropertySslProtocol

この接続の認証に使用されるセキュリティ プロトコルを示す値を取得します。

System_CAPS_pubpropertyTransportContext

取得、 TransportContext 拡張保護を使用して認証に使用します。

System_CAPS_pubpropertyWriteTimeout

取得または書き込み操作がブロックのデータ待機時間を設定します。(Stream.WriteTimeout をオーバーライドします。)

名前説明
System_CAPS_pubmethodAuthenticateAsClient(String)

サーバーの認証にクライアントと、必要に応じてクライアントとサーバーの接続でクライアントによって呼び出されます。

System_CAPS_pubmethodAuthenticateAsClient(String, X509CertificateCollection, Boolean)

サーバーおよび必要に応じてクライアントとサーバー間の接続にあるクライアントを認証するために、クライアントによって呼び出されます。 認証プロセスでは、指定された証明書コレクション、およびシステムの既定の SSL プロトコルを使用します。

System_CAPS_pubmethodAuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean)

サーバーの認証にクライアントと、必要に応じてクライアントとサーバーの接続でクライアントによって呼び出されます。 認証プロセスでは、指定された証明書のコレクションおよび SSL プロトコルを使用します。

System_CAPS_pubmethodAuthenticateAsClientAsync(String)

サーバーの認証にクライアントと、必要に応じて非同期操作としてクライアントとサーバーの接続でクライアントによって呼び出されます。

System_CAPS_pubmethodAuthenticateAsClientAsync(String, X509CertificateCollection, Boolean)

サーバーおよび必要に応じて非同期操作としてクライアントとサーバー間の接続にあるクライアントを認証するために、クライアントによって呼び出されます。 認証プロセスでは、指定された証明書コレクション、およびシステムの既定の SSL プロトコルを使用します。

System_CAPS_pubmethodAuthenticateAsClientAsync(String, X509CertificateCollection, SslProtocols, Boolean)

サーバーの認証にクライアントと、必要に応じて非同期操作としてクライアントとサーバーの接続でクライアントによって呼び出されます。 認証プロセスでは、指定された証明書のコレクションおよび SSL プロトコルを使用します。

System_CAPS_pubmethodAuthenticateAsServer(X509Certificate)

サーバーと、必要に応じて指定された証明書を使用するクライアントとサーバー接続でクライアントを認証するサーバーによって呼び出されます。

System_CAPS_pubmethodAuthenticateAsServer(X509Certificate, Boolean, Boolean)

指定された証明書と要件、およびシステムの既定のセキュリティ プロトコルを使用して、サーバーおよび必要に応じてクライアントとサーバー間の接続にあるクライアントを認証するために、サーバーによって呼び出されます。

System_CAPS_pubmethodAuthenticateAsServer(X509Certificate, Boolean, SslProtocols, Boolean)

指定された証明書、要件、およびセキュリティ プロトコルを使用して、サーバーおよび必要に応じてクライアントとサーバー間の接続にあるクライアントを認証するために、サーバーによって呼び出されます。

System_CAPS_pubmethodAuthenticateAsServerAsync(X509Certificate)

サーバーと、必要に応じて非同期操作として指定された証明書を使用するクライアントとサーバー接続でクライアントを認証するサーバーによって呼び出されます。

System_CAPS_pubmethodAuthenticateAsServerAsync(X509Certificate, Boolean, Boolean)

指定された証明書、要件、およびセキュリティ プロトコルを使用して、サーバーおよび必要に応じてクライアントとサーバー間の接続にあるクライアントを認証するために、非同期操作としてサーバーによって呼び出されます。

System_CAPS_pubmethodAuthenticateAsServerAsync(X509Certificate, Boolean, SslProtocols, Boolean)

指定された証明書、要件、およびセキュリティ プロトコルを使用して、サーバーおよび必要に応じてクライアントとサーバー間の接続にあるクライアントを認証するために、非同期操作としてサーバーによって呼び出されます。

System_CAPS_pubmethodBeginAuthenticateAsClient(String, AsyncCallback, Object)

クライアント、サーバーを認証する非同期操作を開始して、必要に応じて、クライアントによって呼び出されます。

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

指定された証明書およびシステムの既定のセキュリティ プロトコルを使用して、サーバー、および必要に応じてクライアントを認証する非同期操作を開始するために、クライアントによって呼び出されます。

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

クライアント サーバーを認証する非同期操作を開始して、必要に応じて、指定された証明書とセキュリティ プロトコルを使用してクライアントによって呼び出されます。

System_CAPS_pubmethodBeginAuthenticateAsServer(X509Certificate, AsyncCallback, Object)

クライアントを認証する非同期操作を開始するサーバーと、必要に応じてクライアントとサーバーの接続にサーバーによって呼び出されます。

System_CAPS_pubmethodBeginAuthenticateAsServer(X509Certificate, Boolean, Boolean, AsyncCallback, Object)

指定された証明書と要件、およびシステムの既定のセキュリティ プロトコルを使用して、サーバー、および必要に応じてクライアントを認証する非同期操作を開始するために、サーバーによって呼び出されます。

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

指定された証明書、要件、およびセキュリティ プロトコルを使用して、サーバー、および必要に応じてクライアントを認証する非同期操作を開始するために、サーバーによって呼び出されます。

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

ストリームからデータを読み取り、指定した配列に格納する非同期の読み取り操作を開始します。(Stream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) をオーバーライドします。)

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

書き込みの非同期書き込み操作を開始 Bytes は指定したバッファーからストリームします。(Stream.BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) をオーバーライドします。)

System_CAPS_pubmethodClose()

現在のストリームを閉じ、現在のストリームに関連付けられているすべてのリソース (ソケット、ファイル ハンドルなど) を解放します。 このメソッドを呼び出す代わりに、ストリームが適切に破棄されていることを確認します。(Stream から継承されます。)

System_CAPS_pubmethodCopyTo(Stream)

現在のストリームからバイトを読み取り、別のストリームに書き込みます。(Stream から継承されます。)

System_CAPS_pubmethodCopyTo(Stream, Int32)

指定されたバッファー サイズを使用して、現在のストリームからバイトを読み取り、別のストリームに書き込みます。(Stream から継承されます。)

System_CAPS_pubmethodCopyToAsync(Stream)

現在のストリームからすべてのバイトを非同期に読み取り、別のストリームに書き込みます。(Stream から継承されます。)

System_CAPS_pubmethodCopyToAsync(Stream, Int32)

指定されたバッファー サイズを使用して、現在のストリームからバイトを非同期に読み取り、別のストリームに書き込みます。(Stream から継承されます。)

System_CAPS_pubmethodCopyToAsync(Stream, Int32, CancellationToken)

指定されたバッファー サイズを使用して、現在のストリームからバイトを非同期に読み取り、指定されたバッファー サイズとキャンセル トークンを使用して、別のストリームに書き込みます。(Stream から継承されます。)

System_CAPS_pubmethodCreateObjRef(Type)

リモート オブジェクトとの通信に使用するプロキシの生成に必要なすべての関連情報を格納しているオブジェクトを作成します。(MarshalByRefObject から継承されます。)

System_CAPS_protmethodCreateWaitHandle()

互換性のために残されています。 WaitHandle オブジェクトを割り当てます。(Stream から継承されます。)

System_CAPS_pubmethodDispose()

Stream によって使用されているすべてのリソースを解放します。(Stream から継承されます。)

System_CAPS_protmethodDispose(Boolean)

SslStream によって使用されているアンマネージ リソースを解放し、オプションでマネージ リソースも解放します。(AuthenticatedStream.Dispose(Boolean) をオーバーライドします。)

System_CAPS_pubmethodEndAuthenticateAsClient(IAsyncResult)

保留中の非同期サーバーの認証操作の開始を前回呼び出したときに終了 BeginAuthenticateAsServerします。

System_CAPS_pubmethodEndAuthenticateAsServer(IAsyncResult)

保留中の非同期クライアントの認証操作の開始を前回呼び出したときに終了 BeginAuthenticateAsClientします。

System_CAPS_pubmethodEndRead(IAsyncResult)

非同期の読み取り操作の開始を前回呼び出したときに終了 BeginReadします。(Stream.EndRead(IAsyncResult) をオーバーライドします。)

System_CAPS_pubmethodEndWrite(IAsyncResult)

非同期の書き込み操作の開始を前回呼び出したときに終了 BeginWriteします。(Stream.EndWrite(IAsyncResult) をオーバーライドします。)

System_CAPS_pubmethodEquals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。(Object から継承されます。)

System_CAPS_protmethodFinalize()

オブジェクトが、ガベージ コレクションによって収集される前に、リソースの解放とその他のクリーンアップ操作の実行を試みることができるようにします。(Object から継承されます。)

System_CAPS_pubmethodFlush()

基になるデバイスに書き込まれるバッファー内のデータが発生します。(Stream.Flush() をオーバーライドします。)

System_CAPS_pubmethodFlushAsync()

ストリームに対応するすべてのバッファーを非同期にクリアし、バッファー内のデータを基になるデバイスに書き込みます。(Stream から継承されます。)

System_CAPS_pubmethodFlushAsync(CancellationToken)

ストリームに対応するすべてのバッファーを非同期にクリアし、バッファー内のデータを基になるデバイスに書き込み、キャンセル要求を監視します。(Stream から継承されます。)

System_CAPS_pubmethodGetHashCode()

既定のハッシュ関数として機能します。(Object から継承されます。)

System_CAPS_pubmethodGetLifetimeService()

このインスタンスの有効期間ポリシーを制御する現在の有効期間サービス オブジェクトを取得します。(MarshalByRefObject から継承されます。)

System_CAPS_pubmethodGetType()

現在のインスタンスの Type を取得します。(Object から継承されます。)

System_CAPS_pubmethodInitializeLifetimeService()

このインスタンスの有効期間ポリシーを制御する有効期間サービス オブジェクトを取得します。(MarshalByRefObject から継承されます。)

System_CAPS_protmethodMemberwiseClone()

現在の Object の簡易コピーを作成します。(Object から継承されます。)

System_CAPS_protmethodMemberwiseClone(Boolean)

現在の簡易コピーを作成MarshalByRefObjectオブジェクト。(MarshalByRefObject から継承されます。)

System_CAPS_protmethodObjectInvariant()

互換性のために残されています。 この API は 製品 インフラストラクチャをサポートします。コードから直接使用するためのものではありません。 Contract のサポートを提供します。(Stream から継承されます。)

System_CAPS_pubmethodRead(Byte[], Int32, Int32)

現在のストリームからデータを読み取り、指定した配列に格納します。(Stream.Read(Byte[], Int32, Int32) をオーバーライドします。)

System_CAPS_pubmethodReadAsync(Byte[], Int32, Int32)

現在のストリームからバイト シーケンスを非同期に読み取り、読み取ったバイト数だけストリーム内の位置を進めます。(Stream から継承されます。)

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

現在のストリームからバイト シーケンスを非同期に読み取り、読み取ったバイト数だけストリーム内の位置を進め、キャンセル要求を監視します。(Stream から継承されます。)

System_CAPS_pubmethodReadByte()

ストリームから 1 バイトを読み取り、ストリーム内の位置を 1 バイト進めます。ストリームの末尾の場合は -1 を返します。(Stream から継承されます。)

System_CAPS_pubmethodSeek(Int64, SeekOrigin)

この API は 製品 インフラストラクチャをサポートします。コードから直接使用するためのものではありません。 NotSupportedException をスローします。(Stream.Seek(Int64, SeekOrigin) をオーバーライドします。)

System_CAPS_pubmethodSetLength(Int64)

基になるストリームの長さを設定します。(Stream.SetLength(Int64) をオーバーライドします。)

System_CAPS_pubmethodShutdownAsync()

この SslStream を終了します。

System_CAPS_pubmethodToString()

現在のオブジェクトを表す文字列を返します。(Object から継承されます。)

System_CAPS_pubmethodWrite(Byte[])

指定したデータをこのストリームに書き込みます。

System_CAPS_pubmethodWrite(Byte[], Int32, Int32)

指定した数を書き込む Byte指定されたバッファー、オフセットを使用して、基になるストリームにします。(Stream.Write(Byte[], Int32, Int32) をオーバーライドします。)

System_CAPS_pubmethodWriteAsync(Byte[], Int32, Int32)

現在のストリームにバイト シーケンスを非同期に書き込み、書き込んだバイト数だけストリーム内の現在位置を進めます。(Stream から継承されます。)

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

現在のストリームにバイト シーケンスを非同期に書き込み、書き込んだバイト数だけストリーム内の現在位置を進め、キャンセル要求を監視します。(Stream から継承されます。)

System_CAPS_pubmethodWriteByte(Byte)

ストリームの現在位置にバイトを書き込み、ストリームの位置を 1 バイトだけ進めます。(Stream から継承されます。)

SSL プロトコルは、機密性と整合性チェックを使用して送信されるメッセージを提供するのに役立ちます、SslStreamです。 によって提供される、SSL 接続SslStream、通信して、クライアントとサーバー間で機密情報をする場合に使用する必要があります。 使用して、SslStreamから読み取りや、ネットワーク上を転送中にある間に情報が改ざんできないようにするために役立ちます。

SslStreamインスタンスで作成するときに指定するストリームを使用してデータを転送、SslStreamです。 指定するオプションがあるこの基になるストリームを指定するときに終了するかどうか、SslStreamも、基になるストリームを閉じます。 通常、SslStreamクラスが使用されて、TcpClientTcpListenerクラスです。 GetStreamメソッドには、NetworkStreamで使用するのに適した、SslStreamクラスです。

作成した後、SslStreamサーバーと、必要に応じて、クライアントを認証する必要があります。 X509 を提供する必要があります、サーバー証明書をその id を確立しするクライアントもように要求できます。 使用して情報を送信する前に認証を実行する必要があります、SslStreamです。 クライアントは、同期を使用して認証を開始AuthenticateAsClientメソッドで、認証が完了するまでブロック、または非同期BeginAuthenticateAsClientメソッドで、認証が完了するための待機をブロックしません。 サーバーは、同期を使用して認証を開始AuthenticateAsServerまたは非同期BeginAuthenticateAsServerメソッドです。 クライアントとサーバーの両方が認証を行う必要があります。

認証は、セキュリティ サポート プロバイダー (SSPI) チャネル プロバイダーによって処理されます。 クライアントを指定することで、サーバーの証明書の検証を制御する機会が与えられます、RemoteCertificateValidationCallbackデリゲートを作成するとき、SslStreamです。 サーバーでは検証を指定することによっても制御できます、RemoteCertificateValidationCallbackを委任します。 デリゲートによって参照されるメソッドには、リモート パーティの証明書および証明書の検証中に発生した SSPI エラーが含まれます。 サーバーは、デリゲートを指定した場合、デリゲートのメソッドが呼び出されること、サーバーがクライアント認証を要求するかどうかに関係なくに注意してください。 サーバーがクライアント認証を要求していない場合、サーバーのデリゲート メソッドは、null の証明書と証明書のエラーの空の配列を受け取ります。

サーバーは、クライアント認証を必要とする場合、クライアントは認証用の 1 つまたは複数の証明書を指定する必要があります。 クライアントが提供できるクライアントに複数の証明書がある場合、LocalCertificateSelectionCallbackデリゲートをサーバーの正しい証明書を選択します。 クライアントの証明書は、現在のユーザーの"My"証明書ストアにある必要があります。 証明書を使用してクライアント認証はサポートされていません、 Ssl2 SSL バージョン 2 プロトコル。

受信した認証に失敗した場合、 AuthenticationException、およびSslStream使用できなくします。 このオブジェクトを閉じるし、ガベージ コレクターによって収集できるように、すべての参照を削除する必要があります。

サーバー (および必要に応じて、クライアント) の id を確立、SSL ハンドシェイクとも呼ばれる、認証プロセスが成功した場合、およびSslStreamメッセージを交換するクライアントとサーバーで使用できます。 情報を送受信する前に、クライアントとサーバーくださいセキュリティ サービスとレベルによって提供される、SslStreamプロトコル、アルゴリズム、およびオン長所が整合性および機密性が実現するための要件を満たしているかどうかを判断します。 現在の設定が十分なされていない場合は、ストリームが閉じている必要があります。 によって提供されるセキュリティ サービスを確認することができます、SslStreamを使用して、IsEncryptedIsSignedプロパティです。 次の表は、認証、暗号化、およびデータの署名に使用される暗号化の設定を報告する要素を示しています。

要素

メンバー

サーバーと、必要に応じて、クライアントを認証するために使用するセキュリティ プロトコルです。

SslProtocolプロパティおよび関連付けられたSslProtocols列挙します。

キー交換アルゴリズムです。

KeyExchangeAlgorithmプロパティおよび関連付けられたExchangeAlgorithmType列挙します。

メッセージの整合性アルゴリズムです。

HashAlgorithmプロパティおよび関連付けられたHashAlgorithmType列挙します。

メッセージの機密性アルゴリズムです。

CipherAlgorithmプロパティおよび関連付けられたCipherAlgorithmType列挙します。

選択したアルゴリズムの強度です。

KeyExchangeStrengthHashStrength、およびCipherStrengthプロパティです。

認証が成功した後、同期を使用してデータを送信することができますWriteまたは非同期BeginWriteメソッドです。 同期を使用してデータを受信できるReadまたは非同期BeginReadメソッドです。

指定した場合、SslStream基になるストリームを開いたままにすることが完了したら、そのストリームを終了する必要が使用することです。

System_CAPS_noteメモ

かどうか、アプリケーションを作成する、SslStream通常のユーザーの資格情報を持つオブジェクトが実行され、アプリケーションはアクセス許可が明示的に指定されてユーザーにこれを行う場合を除き、ローカル コンピューター ストアにインストールされている証明書にアクセスできません。

SslStreamいるものと、タイムアウト時間と共に、他のIOException内部ストリームからスローされた 1 つは処理されます、致命的な呼び出し元によってです。 再利用して、SslStream後、タイムアウト時間はガベージを返します。 アプリケーションにする必要がありますCloseSslStreamこのような場合に例外をスローします。

.NET Framework 4.6 には、安全性の低い暗号およびハッシュ アルゴリズムの接続をブロックする新しいセキュリティ機能が含まれています。 HttpClient、HttpWebRequest、FTPClient、SmtpClient、SslStream などの Api を介した TLS と SSL を使用して、.NET Framework 4.6 を対象とするアプリケーションでは、既定では、セキュリティが強化された動作を取得します。

開発者は、既存 SSL3 サービスまたは TLS で RC4 サービスと相互運用性を維持するために、この動作を除外する必要あります。 This article新しい動作を無効にできるように、コードを変更する方法について説明します。

.NET Framework 4.6.3 SslStreams、TLS バージョンを指定しないが、代わりにシステムの既定値として定義されている TLS バージョンを使用する認証のあるメソッドに対して新しいオーバー ロードを追加するSCHANNELです。 後で、長期にわたって TLS バージョンのベスト プラクティスの変更として、既定の設定を変更できる手段として、アプリでこれらのメソッドを使用リビルドして、アプリを再配置する必要はありません。

次のコード例で、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, 8080);    
            listener.Start();
            while (true) 
            {
                Console.WriteLine("Waiting for a client to connect...");
                // Application blocks while waiting for an incoming connection.
                // Type CNTL-C to terminate the server.
                TcpClient client = listener.AcceptTcpClient();
                ProcessClient(client);
            }
        }
        static void ProcessClient (TcpClient client)
        {
            // A client has connected. Create the 
            // SslStream using the client's network stream.
            SslStream sslStream = new SslStream(
                client.GetStream(), false);
            // Authenticate the server but don't require the client to authenticate.
            try 
            {
                sslStream.AuthenticateAsServer(serverCertificate, 
                    false, SslProtocols.Tls, true);
                // Display the properties and settings for the authenticated stream.
                DisplaySecurityLevel(sslStream);
                DisplaySecurityServices(sslStream);
                DisplayCertificateInformation(sslStream);
                DisplayStreamProperties(sslStream);

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

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

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

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

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

次のコード例では、作成するを示します、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,443);
            Console.WriteLine("Client connected.");
            // Create an SSL stream that will close the client's stream.
            SslStream sslStream = new SslStream(
                client.GetStream(), 
                false, 
                new RemoteCertificateValidationCallback (ValidateServerCertificate), 
                null
                );
            // The server name must match the name on the server certificate.
            try 
            {
                sslStream.AuthenticateAsClient(serverName);
            } 
            catch (AuthenticationException e)
            {
                Console.WriteLine("Exception: {0}", e.Message);
                if (e.InnerException != null)
                {
                    Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
                }
                Console.WriteLine ("Authentication failed - closing the connection.");
                client.Close();
                return;
            }
            // Encode a test message into a byte array.
            // Signal the end of the message using the "<EOF>".
            byte[] messsage = Encoding.UTF8.GetBytes("Hello from the client.<EOF>");
            // Send hello message to the server. 
            sslStream.Write(messsage);
            sslStream.Flush();
            // Read message from the server.
            string serverMessage = ReadMessage(sslStream);
            Console.WriteLine("Server says: {0}", serverMessage);
            // Close the client connection.
            client.Close();
            Console.WriteLine("Client closed.");
        }
        static string ReadMessage(SslStream sslStream)
        {
            // Read the  message sent by the server.
            // The end of the message is signaled using the
            // "<EOF>" marker.
            byte [] buffer = new byte[2048];
            StringBuilder messageData = new StringBuilder();
            int bytes = -1;
            do
            {
                bytes = sslStream.Read(buffer, 0, buffer.Length);

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

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

.NET Framework
2.0 以降で使用可能

この型のパブリック static (Visual Basic では Shared ) メンバーはスレッド セーフです。インスタンス メンバーの場合は、スレッド セーフであるとは限りません。

トップに戻る
表示: