問題タブ [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# - .NET SslStream が機能しない
.net SslStream で tls トンネルを初期化しようとしていますが、ストリームを開いた後、常に次のエラーが発生します。
「トランスポート接続からデータを読み取れません: 確立された接続は、ホスト マシンのソフトウェアによって中止されました。」
TLS 接続を確立した後、2 番目のメッセージを送信した後。
この 4 日間、答えを探していましたが、役立つ情報がオンラインにありません!
編集: talk.google.com に接続しようとしています
MSDN のコード サンプルを使用しています。唯一の違いは、前にデータを送信していることと、tls を使用するときに次のことを行うことです。
編集:最初のエラー(送信の処理方法に関する小さなバグ)をなんとか解消できました。今では常に取得しています
「トランスポート接続からデータを読み取れません: 確立された接続は、ホスト マシンのソフトウェアによって中止されました。」
編集 2: 空白を送信していません。メッセージの受け渡し部分を書き直しましたが、まだ同じ問題があります。
私はから始めます
次に、受信時に次のものを持っています
c# - SslStream の使用時に NetworkStream.DataAvailable プロパティが正しい結果を返さない
私は永続的なソケットを持つアプリケーションを持っています (アプリケーションの起動時に開いており、アプリケーションと共に閉じています)。
このソケットは、サーバーがデータをプッシュするために使用されます。
この接続は HTTP または HTTPS のいずれかである可能性があるため、オブジェクトを初期化するために次のコードを記述しました。
このようにして、HTTP プロトコルと HTTPS プロトコルの両方を処理できます。
次に、ソケットでデータが利用可能になるのを待つこのループ (スレッド内) を取得しました。
ここに私の2つの質問があります:
ドキュメントによると、使用可能なデータがない場合、Read メソッドは 0 を返します。しかし、私の場合、Read は 0 より大きい数値を返すか (一部のデータが読み取られた場合)、タイムアウトになったために例外をスローします...ここで何が欠けていますか? Read が 0 を返すのはどのような状況ですか?
接続が HTTP プロトコルを使用している場合、このコードは正常に機能します。すべてを受信し、メッセージがバッファー サイズ (CST_STREAM_BUFFER_SIZE) よりも大きい場合、DataAvailable は true のままで、ループは残りのデータをすべて読み取ります。しかし、HTTPS でこれを試すと、バッファより小さいメッセージに対してのみ機能します。メッセージが大きい場合、Read メソッドは最初に CST_STREAM_BUFFER_SIZE バイトを読み取り、次に DataAvailable が false になりますが、一部のバイトは明らかに読み取る準備ができています。この場合、別のメッセージを受信すると、DataAvailable が再び true になるため、残りのデータが「スタック解除」されます。私は何を間違っていますか?両方のケースで DataAvailable が同じように動作しないのはなぜですか?
どんな助けでも大歓迎です。
ssl - PFX ファイルを使用した SslStream AuthenticateAsClient
SslStream を使用してサーバーに接続しようとしています。サーバーの所有者から PFX ファイルを受け取り、それをクライアントにインストールしましたが、コードから証明書にアクセスする方法がわかりません。
具体的には、次のコードがあると想像してください...
serverName の値は?
サーバーのIPアドレス
「MyServer」
「CN = MyServer」 を試してみました
これらの値はどれも機能していないようです。マシンの証明書ストアにアクセスするために何か追加する必要がありますか、それとも serverName が何である必要があるのか わかりませんか?
c# - 特定の公開鍵で署名された証明書のみを受け入れるよう SslStream に要求する
私はこれを実装していますが、安全であることを確認したいと考えています。目標は、SSLStream を使用し、特定の RSA キーによって署名されたサーバーからの SSL 証明書のみを受け入れることです。
これが私の接続コードです:
そして、これがValidateServerCertificateの私の実装です:
X509Chain オブジェクトが豊富であるため、X509ChainStatusFlags.NotSignatureValid などをチェックする必要がないことを確認したいと思います。
たとえば、攻撃者が私の公開鍵で署名されていることを「主張」し、無効な署名を送信することは可能でしょうか?
ありがとう!!
更新: OK、これまでのところ、元の foreach の上に次のチェックを入れることにしました。これは多少アプリケーション固有であることに注意してください。たとえば、証明書を期限切れにしたい場合は、NotTimeValid などをチェックします。
c# - c#SslStream.Readループの問題
私はアプリを作成してC#を学んでいますが、本当に苦労している問題にぶつかりました。
基本的に、私は以下のコードを持っています。これは、私がセットアップしたネットワークストリームから読み取るために使用しているものです。これは機能しますが、sslstream.Read()のブロックが解除されるたびに1つのパケットを読み取るだけです。それはメッセージの大きなバックログを引き起こします。
読み取ろうとしているのは、読み取られたストリームの一部に複数のパケットが含まれていて、それらすべてを読み取った場合です。
私はそれを解決するために何度も試みましたが、私はちょうどコードの大きな混乱に終わりました。
誰かが手伝ってくれるなら、私はそれをいただければ幸いです!
(各パケットの最初の4バイトはパケットのサイズです。パケットの範囲は8バイトから28,000バイトです)
c# - C#: sslStream とローカル プロキシ
SSL接続を受け入れるサーバーがあります。リクエストするとhttps://gmail.com
、サーバーは最初にログインしているかどうかを確認し、ログインしている場合はgmailに接続して応答を返します。ログインしていない場合は、ログイン ページにリダイレクトされます。私の要件は次のとおりです。
TCPListener
ローカル プロキシ (127.0.0.1:13000 など) をリッスンするを作成する必要があります。ブラウザからリクエストが来るたびに、サーバーへのssl接続を作成してリクエストを渡す必要があります。
サーバーは、ログイン URL または成功のいずれかで応答します。次に、ブラウザーで同じことを行う必要があります。
私が書いたコードは次のとおりです。
コードを実行すると、添付した出力が得られます。(ブロックされたテキストは、私の会社のログイン URL を示しています)
ブラウザがログイン ページにリダイレクトしない理由を教えてください。
ありがとうイルファン
c# - C# SSL セキュア ソケット
C# で記述された、うまく機能するコミュニケーター アプリケーションがあります。次に、サーバーへの安全な接続を実装する必要があります。Socket および TcpClient オブジェクトを SslStream に変更しようとしましたが、いくつかのエラーが発生しました。
まず、makecert を使用して .cer 証明書を生成しました。OpenSSL 証明書には秘密鍵が含まれていなかったため、うまくいきませんでした。次に、サーバー上に証明書オブジェクトを作成し、それを SslStream にバインドしました。
クライアント側で私はこれをやっています:
しかし、AuthenticateAsClient 関数は例外をスローします。他のいくつかのメソッドパラメーターを試しましたが、どれもうまくいきませんでした。
誰かが私を助けたり、単純なソケットを安全なソケットに変更する方法を段階的に説明したりできますか? 明確にするために、SSL は要件ではありません。接続を安全にする簡単な方法があれば、それを使用できます。
編集:例外のメッセージは次のとおりです。
c# - SslStream は TcpClient.Available に相当しますか?
この質問の@Len-Holgateのアドバイスに基づいて、0バイトの読み取りを非同期に要求し、コールバックで同期読み取りで使用可能なバイトを受け入れます。これは、データが使用可能でブロックされないことがわかっているためです。これはとても効率的で素晴らしいようです。
しかし、SslStream のオプションを追加すると、このアプローチは崩壊します。ゼロバイトの読み取りは問題ありませんが、SslStream はバイトを復号化し、TcpClient のバッファーにゼロのバイト数を残して (適切に)、読み取りに使用できる SslStream のバイト数を判断できません。
これに簡単なトリックはありますか?
コンテキストのためだけに、いくつかのコード:
EndRead() (正しく 0 を返す) の後、DataAvailable には以下が含まれます。
また、プロトコルのために、バイト単位で評価し、可変バイト幅の Unicode などをデコードする必要があります。バイト単位で非同期に読み取る必要はありません。
c# - GZipStream 4G 制限 - 合計または現在のストリーミング?
GzipStream
食べさせてくださいSSLStream
。
今日初めて「gzip ストリームには 4GB を超えるデータを含めることはできません」と気づきました。
ネットワークへのライターは、リーダーがデータを取得するよりも速くデータをフィードしています。そのため、エラーの原因は私には不明です。
これは、ストリームを介して書き込まれる合計バイト数の制限ですか、それとも からデータを出し入れするバックログの問題GZipStram
ですSSLStream
か?
リーダーは、ストリームが終了する前にデータを解凍して使用できるため、書き込まれる合計バイト数にそのような制限があるとは思いもしませんでした。
長さを確認する方法はないようです。
彼らがこれをどのように処理したかについて、誰かが例を共有できますか?
コードの概要: