問題タブ [sslstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - サーバーがSSL接続とプレーンテキスト(安全でない)接続の両方を受け入れるようにするにはどうすればよいですか?
安全なSSLと安全でないプレーンテキスト接続の両方を受け入れることができるサーバーを作成しようとしています(下位互換性のため)。安全でないクライアントから受信した最初の送信データがサーバーで最初の5バイト(chars)を失うことを除いて、私のコードはほぼ機能しています。より具体的には、安全でない接続で30バイトを送信する場合、サーバーがOnClientDataReceived()
関数に到達すると、行 " int iRx = nwStream.EndRead(asyn);
"、次にiRx = 25
。クライアントから送信される後続のメッセージには、期待どおりに送信されたすべてのバイト/文字が含まれます。接続の最初の仮定はSSLStream
最初の5バイトを削除している可能性があり、失敗した場合、それらの5バイトはすでにバッファーから抽出されており、使用できなくなります。サーバーがオンザフライで自動的に切り替わるようにコードを書くために私が取ることができる別のアプローチを知っている人はいますか?
私は次のことを避けようとしています:
- クライアントがプレーンテキストを使用して接続し
NetworkStream
、SSLストリームへのアップグレードを要求することを要求する - 2つの異なるポートに2つを設定する
TcpListeners
(1つは安全用、もう1つは安全でないため)
これが私のコードです:
何が機能するか:
- サーバーに証明書がない場合は、NetworkStreamのみが使用され、すべてのメッセージについてすべてのバイトがクライアントから受信されます。
- サーバーに証明書があり(SSLStreamがセットアップされている)、安全な接続を確立でき(https://を使用するWebブラウザー)、すべてのメッセージに対して完全なメッセージが受信される場合。
動作しないもの:
- サーバーに証明書があり(
SSLStream
セットアップされている)、クライアントから安全でない接続が確立されている場合、そのクライアントから最初のメッセージを受信すると、コードは認証されていないことを正しく検出し、のにSSLStream
切り替わります。ただし、最初のメッセージに対してが呼び出されると、送信されたメッセージから最初の5文字(バイト)が欠落しますが、最初のメッセージに対してのみです。が接続されている限り、残りのすべてのメッセージは完了です。クライアントが切断してから再接続すると、最初のメッセージがクリップされ、その後のすべてのメッセージは再び正常になります。NetworkStream
TCPClient
EndRead
NetworkStream
TCPClient
これらの最初の5バイトがクリップされる原因は何ですか?どうすればそれを回避できますか?
私のプロジェクトは現在.NETv3.5を使用しています...このバージョンを維持し、回避できる場合は4.0にステップアップしないようにします。
フォローアップの質問
以下のDamienの回答では、欠落している5バイトを保持できますが、ブロックを回避するために、コード内のメソッドBeginRead
とメソッドを使用することをお勧めします。EndRead
これらをオーバーライドするときの「ベストプラクティス」を示す良いチュートリアルはありますか?より具体的には、IAsyncResult
オブジェクトの操作方法。私は、RestartableStreamバッファーに格納されているコンテンツを追加し、次に内部ストリーム(ベース)にフォールスルーして残りを取得し、トーラルを返す必要があることに気付きました。しかし、IAsyncResult
オブジェクトはカスタムクラスであるため、RestartableStreamのバフを内部ストリームのバフと組み合わせることができる一般的な方法を理解できません。ユーザーがコンテンツの保存を希望するバッファーを知るために、BeginRead()も実装する必要がありますか?もう1つの解決策は、バイトのドロップの問題はクライアントからの最初のメッセージのみにあるため(その後、それをaSSLStream
またはとして使用するかどうかがわかります)、 RestartableStreamのメソッドをNetworkStream
直接呼び出すことによってその最初のメッセージを処理することです。Read()
(一時的にコードをブロックします)その後、今後のすべてのメッセージで、非同期コールバックを使用して、現在のようにコンテンツを読み取ります。
c# - SslStream別のスレッド
sslストリーム(Webサイトから)からのデータを画面に表示しようとしています。データがいつ到着するかわからないので、バイトが読み取られるまでストリームから読み取りを続ける別のスレッドを使用しました。これは完全に機能しますが、CPU使用率は25%に跳ね上がり、そこにとどまります(これは、最大使用量で1スレッド、私のPCには4スレッドです)。スレッドがwhileループでスタックしているため、これは少し意味がありますが、ThreadクラスのインスタンスがCPUのスレッド全体を消費することは期待していませんでした(単純なClient/を使用している場合はこれが発生していないことを誓うことができます。サーバーアプリケーション)。
接続が初期化されるとすぐにスレッドの実行が開始され、ユーザーはいつでもWebサイトにデータを送信でき、アプリケーションは応答を出力することになっています。これに対する代替ソリューションは何でしょうか?SslStreamを削除して、他のものを使い始める必要がありますか?
この別のスレッドで実行されるコードは次のとおりです。
みなさん、ありがとうございました。
編集:
「gt」が示唆するように、代わりにBeginReadとEndReadを使用してみました。このために、ユーザーからリクエストが送信されるたびにBeginReadを使用しています。すべてのデータを受信したら、画面に印刷します。これはうまくいくようですが、将来問題が発生するかどうか心配です。パケットがめちゃくちゃになる可能性はありますか?たとえば、EndReadが最初のパケットの最後に0を返さず、2番目のパケットを読み取り続ける可能性はありますか?それが可能であれば、どうすればこれを解決できますか?受信したデータはhttp層の本体にすぎないため、パケットの長さを知るために事前にIP層にアクセスすることはできません。
再度、感謝します
c#-4.0 - SslStream TcpClient - トランスポート ストリームから予期しない EOF または 0 バイトを受信しました
SslStream / Tcp クライアント経由でサーバーに接続しようとしています。毎回、次のような例外が発生します。AuthenticateAsClient 行でトランスポート ストリームから予期しない EOF または 0 バイトを受信しました。
トレース ログを有効にしましたが、ログに次の 2 つのエラーが記録されています。
System.Net 情報: 0: [12260] SecureChannel#66702757::.ctor(ホスト名 = xxx.xx.xx.xxx、#clientCertificates = 0、encryptionPolicy = RequireEncryption)
System.Net 情報: 0 : [12260] SecureChannel#66702757 - 選択できるクライアント証明書が 0 個残っています。
これを解決する方法について誰かアドバイスをいただけますか?理由はわかりませんが、違いがある場合は外側のキャッチに投げています。
ssl - STARTTLS SMTP コマンドについて
STARTTLS コマンドは TLS チャネル専用ですか、それとも SSL チャネルで使用できますか? SslProtocols 列挙のメンバーとして使用できる場合でも、.Net4 は TLS をサポートしていないため、SslStream として使用できる TlsStream はありますか。
c# - SslStream 復号化の問題?
TcpClient と SslStream を使用して https リクエストをサーバーに送信しています。通常は機能し、ヘッダーがプレーンテキストで返されるのを確認できますが、ページのコンテンツは意味不明です。何が間違っているのかわかりません。
コード スニペットを次に示します。
コンソールに書き込まれた結果の例:
ssl - .NET で SSL を使用するには、証明書から何が必要ですか?
The server mode SSL must use a certificate with the associated private key.
Base64 でエンコードされた.crtファイルと、同等の形式の秘密 RSA キーを含む、証明書プロバイダーからの多くの情報を含む別の巨大なテキスト ファイルがあります。それを.pvkファイルに入れて後で.pfx
ファイルを作成
しようとしましたが、うまくいきませんでした。
この証明書を使用して .NET アプリケーションで SSL を使用するには、実際に何をする必要がありますか?
編集: 適切な.pvkを作成し、.pfxを作成しましたが、それでも同じエラーが発生しました。
vb.net - SslStream: ポーリング IO を実行するために利用可能なチェック データを使用する
しばらく前に、vb.net でいくつかの基本的な HTTP Web サーバーを作成しました。IO のブロックを回避しようとしたため、基本的に現在のすべての接続に対して 1 つのポーリング スレッドを作成しました。
したがって、接続に新しいデータがあるときはいつでも、それを読み取ることができました。それ以外の場合は、すぐに次の接続を確認します。
今、私はhttpsでウェブサーバーを拡張しています。したがって、.Net SslStream クラスを使用しました。同じ原則を適用したい (すべてのストリームを読み取るための 1 つのポーリング スレッド)
.DataAvailable プロパティがないため、幅 .Length > 0 を試しましたが、これにより NotSupportedException が発生します (このストリームはシーク操作をサポートしていません)
では、スレッドをブロックせずに、特定の復号化されたストリームに利用可能なデータがあるかどうかを判断するにはどうすればよいでしょうか?