問題タブ [sslengine]
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.
java - SSL とソケットチャネル
理想的には、単純なSSLSocketChannel
.
通常のメッセージを読み書きするコンポーネントを既に持っていますがSocketChannel
、これらの接続の一部では、ネットワーク上で SSL を使用する必要があります。ただし、これらの接続に対する操作は同じです。
SSLSocketChannel
無料の実装(適切なセレクターを使用)または同様のものを知っている人はいますか?私はこれを見つけましたが、ベンダーが SUN ではないため、セレクターはそれを受け入れません。
単純なオブジェクトを介したネットワーク データの挿入と取得から read_from/writing_to ネット ロジックを切り離して、腹を立てSSLEngine
ずに a を使用するようにしていますが、それを正しく実装するのは本当に難しいです。 SSLプロトコルの内部...
java - SSLEngine とクローズ
SSL で使用されるチャネルからクリーンなデータを取得し、暗号化されたデータをそこに書き込むことができるヘルパー モジュールを実装しました。私には、「DataProvider はインターフェースであるべきだ」と ;)):
SSL の抽象基本クラスを実装しました。その実装のテスト中に、私は 2 つの関数を作成しました。1 つは SocketChannel でメッセージを受信し、データの送信に使用される SSLSocket は接続を閉じます。もう 1 つは、SocketChannel でメッセージを送信し、それで終了を開始します。さて、問題は、これらの手順を実行しても、データの受信に使用される SSLSocket が閉じないことです。
- engine.closeOutbound()
- エンジン.ラップ()
- channel.write(data) (はい、wrap() で取得したすべてのデータを送信したと確信しています)
- 受信 close_notify を読み取るためのチャネルの選択
問題は、セレクターが 4 番目のステップでスタックしていることです。
他のテスト (SSLSocket が接続を閉じる) では、問題はありません。
shouldClose を次のように実装したことに注意してください。
したがって、クローズを初期化したとしても、クローズするには着信 close_notify が必要です (これが正しいかどうかはわかりません: 最終的には で変更できますreturn engine.isOutboundDone()
)
これは、コードの SSLSocket 側です。
最後のアサートに違反しています。
最初は、これは toRead に関連付けられた「バックグラウンド」スレッドがないためだと考えていたので、着信を消費してclose_notify
から最終的にソケットを閉じるために読み取り/書き込みを行う必要がありますが、それでもそうではありませんヘルプ。
何か案が?
java - ハンドシェイクプロセス中にSSLEngineWrapメソッドからSSLExceptionを取得します
SSL接続を確立するためにJavaアプリケーションでクライアントハンドシェイクプロセスを実行するSSLException
と、wrapメソッドの2回目の呼び出しが行われます。CLientKeyExchange
この時点で、クライアントがとをサーバーに送信することを理解してChangeCipherSpec
います。例外から表示されるエラーメッセージは「一般的なSSLEngineの問題」です。送信する必要のある証明書に問題があるのではないでしょうか。
例外スタックの詳細は次のとおりです。
これが私のコードです。ハンドシェイクはRead
メソッドから始まります。
java - 暗号化なしの sslengine 暗号スイート
SSLEngine
Javaの
使用に小さな問題があります。クライアントとサーバー間のSSL接続を作成するために使用しました。これは Web ベースのアプリケーションではありません。
私の製品の開発者がクライアントとサーバーの間で通信するためのフレームワークを作成しています。それらの構成に基づいて、接続を作成する必要があります。暗号化が必要な場合は、暗号化されたチャネルを作成して提供する必要があります。そうでない場合は、暗号化なしでメッセージ ダイジェストを使用する SSL チャネルを作成する必要があるため、有効にする必要がある暗号スイートはSSL_RSA_WITH_NULL_MD5
. 暗号化が必要な場合は、 を使用しますSSL_RSA_WITH_<some encryption algo>_SHA/MD5
。
2 番目の構成はできますが、構成はできませんSSL_RSA_WITH_NULL_MD5
。message で例外が発生していますNo cypher suites in common
。これを開発するために使用したフレームワークは Netty(jboss-netty) です。
これに関して誰でも私を助けることができますか??
コード ::
android - websocket と socket.io を使用して Java で SSL に接続するにはどうすればよいですか?
java で wss:// プロトコルにアクセスするにはどうすればよいですか?
benkay / java-socket.io.client を使用していますが、wss プロトコルをサポートしていません。
SSLEngineを使ってみました。しかし、それは非常に大変な作業です。
どのようにJavaでsslに接続できますか?
SSLEngine で SocketChannel を変更してみました。しかし、それは機能しません。
SSL チャネルは問題ありません。しかし、私はこの元の websocket 部分を配線できません。
これはソースコードです。
この点は正しくありませんか?? わかりません..元のwebsocketコードと同じではありません..問題はこの点です。どうすれば修正できますか??
SSLClient はhttp://rapidant.tistory.com/attachment/cfile25.uf@121346414D45B0960BD01B.zipです。
key store : JKS を BKS に変更します。問題ありません。
SocketChannel をどのようにラップできますか?
(Webブラウザは動作しました。)
java - 自己署名証明書と SSLEngine (JSSE) を使用した SSL ハンドシェイク
私は、SSL メッセージと非 SSL メッセージを同じポートで処理できるカスタム/スタンドアロン Java Web サーバーを実装する任務を負っています。
私はNIOサーバーを実装しましたが、非SSLリクエストに対しては非常にうまく機能しています。私はSSLの部分でかなりの時間を過ごしており、実際にいくつかのガイダンスを使用することができます.
これが私がこれまでに行ったことです。
SSL メッセージと非 SSL メッセージを区別するために、インバウンド要求の最初のバイトをチェックして、それが SSL/TLS メッセージかどうかを確認します。例:
parseTLS() メソッドでは、次のように SSLEngine をインスタンス化します。
SSLEngine がインスタンス化されたら、公式のJSSE サンプルからそのままコードを使用して、unwrap/wrap メソッドを使用してインバウンド データを処理します。
ハンドシェイクの最初の部分はうまく機能しているようです。クライアントはハンドシェイク メッセージを送信し、サーバーは 4 つのレコードを含むメッセージで応答します。
次に、クライアントは次の 3 つの部分からなるメッセージを送信します。
SSLEngine はクライアント リクエストをアンラップしてレコードを解析しますが、ラップ メソッドは OK/NEED_UNWRAP のハンドシェイク ステータスで 0 バイトを生成します。つまり、私がクライアントに送り返すものは何もなく、握手は金切り声で停止します。
これは私が立ち往生しているところです。
デバッガーで、SSLEngine、特に ServerHandshaker がピア証明書を見つけられないことがわかります。これは、長さが 0 バイトのクライアントからの証明書レコードを見ると明らかです。しかし、なぜ?
HelloServer の応答に何か問題があるとしか思えませんが、それを特定することはできません。サーバーは有効な証明書を送信しているようですが、クライアントは何も返していません。キーストアに問題はありますか? それともトラストストアですか?それとも、SSLEngine をインスタンス化する方法と関係がありますか? 私は困惑しています。
他のポイントを結合します。
- 上記のコード スニピットで参照されているキーストアとトラストストアは、次のチュートリアルを使用して作成されました: http://www.techbrainwave.com/?p=953
- サーバーをテストするクライアントとして Firefox 10 と IE 9 を使用しています。両方の Web クライアントで同じ結果が得られます。
- Sun/Oracle JDK 6 と、それにバンドルされている Java Secure Socket Extension (JSSE) を使用しています。
アドバイスをお待ちしておりますが、私が頭がおかしいとか、Netty や Grizzly などの既存のソリューションを使用するなどとは言わないでください。現時点ではオプションではありません。私は自分が間違っていることを理解したいだけです。
前もって感謝します!
java - JSSE SSLEngine による SSL セッション管理
NIO と SSLEngine を使用して SSL Web サーバーに取り組んでいます。ハンドシェイクを正常に処理し、アプリケーション データを送受信できます。ただし、SSL セッション状態を維持する方法を理解するのに苦労しています。
Web サーバーのテストに Firefox 10 を使用しています。最初のページの読み込みでは、すべてがうまく機能します。ハンドシェークが正常に完了しました。サーバーはクライアントの要求を処理し、応答を返します。レスポンスは問題なく送信され、ブラウザはアプリケーション データ (html、画像など) を読み込みます。これは、クライアントからサーバーに送信されたメッセージのスナップショットです。
ページリクエスト #1
繰り返しますが、最初のページの読み込みでは、すべてがうまく機能します。ただし、ブラウザを更新するか、別の「ページ」に移動すると、Firefox はクライアント ハローの代わりにアプリケーション レコードを送信します。
ページリクエスト #2
この場合、SSLEngine は、アプリケーション データをアンラップしようとすると例外をスローします。
これは、ページ要求ごとに新しい SSLEngine をインスタンス化しているためだと思います。SSLEngine を 1 回だけインスタンス化してグローバル/静的変数にすると、アプリケーション レコードが正常にラップ解除され、クライアントに応答を返すことができます。問題なくページを更新したり、他のページにアクセスしたりできます。SSL ハンドシェイク プロセス全体をスキップしているため、ページの読み込みは非常に高速です。
残念ながら、これらすべての処理中に別のブラウザー (IE や Safari など) から Web サーバーにアクセスすると、SSLEngine 内のセッション状態が不安定になり、Web サーバーは新しい SSL 要求に応答できなくなります。そのため、SSLEngine を一度インスタンス化して、それをグローバルにアクセス可能な静的変数にすることは、実行可能なオプションではないようです。そう...
2 番目のページ リクエスト (ページ リクエスト #2) には、一体どのように応答すればよいのでしょうか? IP アドレス以外で、2 番目のページ要求 (ページ要求 #2) を最初のハンドシェイク要求 (ページ要求 #1) に結び付ける方法はありますか? 2 番目のページ要求 (ページ要求 #2) のアプリケーション データ内に SSL セッション ID が埋め込まれていますか?
前もって感謝します!
ssl - Netty ClientBootstrapSSLハンドシェイクが終了します--チャネル/ClientBootstrapが閉じていますか?
テストアプリケーションへの接続は、エラーなしで同じ場所で終了し続けます。
おそらく何かがチャネル/接続を閉じるきっかけになっていると思いますが、それが何であるかはわかりません。コードのプリントアウトを変更すると、正確に閉じる場所がわずかに変わるため、タイミングが別のスレッドにあるように見えます。
私はこれに4日間取り組んできましたが、正式に立ち往生していると自分自身をリストします。
これが私の接続コードです:
これは、SSLデバッグを有効にした場合の出力のようになります。
それが終了するところです。印刷出力を少し変更して、もう1行、logger.info( "Connected to" + realRequest.getHost()+ ":" + realRequest.getPort()+ "" + realRequest.getUri()); しかし、何が原因でシャットダウンしたのかは本当にわかりません。
netty SSLHandlerをオーバーライドしようとしましたが、すべてのパブリック操作でプリントアウトが追加されましたが、close()、channelConnected()、channelDisconnected()などのメソッドが呼び出されることはありません。handshake()も同様です。
私のパイプラインはハンドシェイクを行うように設定されています:
私のカスタムSSLHandlerは、実際にはライブラリのSslHandlerと同じです。スーパーバージョンに委任する前に、プリントアウトを追加するメソッドをオーバーライドするだけです。
呼び出されているのはhandleDownstream()だけのようです。
android - Android SSL エンジンの例
作業中のアプリの TLS 経由で TCP ソケットを使用する必要があります。私は何十もの例を経験してきましたが、ハンドシェイクを通過するのに問題はありませんが、入力ストリームを何らかの手段で読み取ることができないようです (readline()、文字配列への読み取りなどを含む多くのことを試しました)。試すたびに、アプリはその場でフリーズします。デバッグすると、コードの次の行に進みません。
試行された解決策として、SSL 用の java.nio に対する Java 1.5 の回答であるはずの SSLEngine の使用に移行することにしました。ただし、1 つの例を見つけました (ここ: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java )。私はそれを実装することに成功していません。試してみると、 unwrap() 呼び出しによって空のバッファーが生成され、(コマンド ラインで OpenSSL を使用して) 問題のサービスがデータをパイプにプッシュしていることがわかります。
提案は大歓迎です。私はすでにこれに多くの時間を費やしてきました。関連するコードは次のとおりです。
java - SSLEngine(JSSE)を使用した古いクライアントとのSSLハンドシェイク
これは、「自己署名証明書とSSLEngine(JSSE)を使用したSSLハンドシェイク」のフォローアップ質問です。
同じポートでSSLメッセージと非SSLメッセージを処理できるNIOWebサーバーを実装しました。SSLメッセージと非SSLメッセージを区別するために、インバウンド要求の最初のバイトをチェックして、SSL/TLSメッセージであるかどうかを確認します。例:
parseTLS()メソッドでは、SSLEngineをインスタンス化し、ハンドシェイクを開始し、メッセージをラップ/アンラップします。ほとんどの最新のWebブラウザー(Firefox 10、IE 9、Safari 5など)ではすべてが正常に機能しているようです。
問題は、IE6のような古いWebブラウザとJavaのURLConnectionクラスのようなライブラリがSSL/TLSハンドシェイクを異なる方法で開始するように見えることです。たとえば、IE 6の最初の数バイトは次のようになります(16進値)。
メッセージをSSLEngineに渡すと、メッセージを認識していないようで、例外がスローされます。
では、IE 6とJavaのURLConnectionクラスは正確には何を送信しているのでしょうか?これは、JSSESSLEngineがサポートできる有効なSSL/ TLSメッセージですか?別のメッセージを送信するには、前処理を行う必要がありますか、それともクライアントと交渉する必要がありますか?
前もって感謝します!
アップデート
ブルーノとEJP、そしてさらにいくつかのデバッグのおかげで、私は何が起こっているのかをはるかによく理解できました。ブルーノが正しく指摘したように、IE6およびJava6クライアントはSSLv2ClientHelloを介して送信しています。以前のコメントの1つとは異なり、Java 1.6のSSLEngineは、実際にはSSLv2メッセージをアンラップし、クライアントに送り返すための有効な応答を生成できます。以前に報告したSSLExceptionは私の側のエラーであり、SSLEngineとは関係ありません(クライアントがデータの送信を完了したと誤って想定し、SSLEngineがより多くのデータのラップ解除を期待していたときに空のByteBufferになってしまいました)。