2016-11-23 2 views
2

私は現在のプロジェクトでクライアントがサーバーへのSSL接続を開始するSNIパターンを使用しようとしています。クライアントが接続しようとしているホスト/サーバー名をサーバーに知らせたいと思います。このサーバー名は、クライアントによって提供されます。私はExtendedSSLSessionオブジェクトを持っていますが、Java 7を使用しているので、私が探している正確な機能を実現するgetRequestedServerNames()メソッド(Java 8で導入されました)を使用することはできません。私の現在の状況では、私のJavaバージョンを残念ながらアップグレードすることはできません。Java 7にはgetRequestedServerNames()と同等の機能がありますか?

Java 7を使用するときにサーバー名を取得する回避策があるかどうかをコミュニティに尋ねたがっていますか?

私はどんな指針もありがとう。

ありがとうございました!

+0

[サーバー名表示(SNI)を実装する方法](http://stackoverflow.com/q/5113333)、[SNIを使用して複数のドメインを1つのボックスに表示する](http://stackoverflow.com/q/22373332)、[SSL_CTX_set_tlsext_servername_callbackコールバック関数が呼び出されていません](http://stackoverflow.com/q/22607121)を参照してください。 – jww

+0

申し訳ありませんが、この情報をどのように使用することができますか教えてください。彼らはSSL_get_servernameを使用しているように思えますが、これはJava 7の実装を見つけることを望んでいると思いますか?ありがとう! –

+0

これはOpenSSLコールです。なぜ質問にOpenSSLタグがあるのですか? – jww

答えて

0

JDK 7と8はopensourceなので、原則として必要な新しいコードをバックポートして独自のバージョンをビルドすることができます(7.5と呼んでください)。 /公式のjava7 JREしかし、相当数のランタイムシステムやアプリケーション、特にビジネスクリティカルなアプリケーションについて話しているのであれば、サポートするのは面倒かもしれません。 と同じことをやってみることができます。また、java8の新機能と同じ理由で、 'underneath'というドキュメントに基づいています。具体的にあなたがSSLServerSocketSSLSocket(client=false)インタフェース「シンプル」を使用している場合:

  1. (TCPコネクションを自分(明示的またはSSLServerSocketの交換で)

  2. はのClientHelloを読み、作品を解析を受け入れる秒)あなたは、このデータを記憶しているSocketのためのラッパーを作成SNI拡張

  3. 、すなわちたいとreadが最初に戻って、それを呼ばれたときにものClientHelloとを含むbyte[]のようなものを持っていますClientHello既読とwrite及び他の操作が

  4. このラッパーソケット「上に」サーバー側SSLSocketを作成するなどの通常の動作及び通常

  5. として使用しながら、その後、実際のソケットから読み出します例えばX509KeyManagerコールバックで、[SSL]SocketからExtendedSSLSessionを見るのではなく、Socketをラッパーソケットにダウンキャストして見て、SNIを取得したいとします。 (あなたがjava8に入手できますときに、それ自体を遮断socket instanceof MyWrapperでこの条件にすることができます。)

をあなたはSSLEngineインタフェースを使用している場合は、すでに接続およびI/O、あなたのように管理しています最初の入力(ClientHello)をSSLEngineに送ってそれを解析してラッパーで覚えておく前に、2、3A、および5を実行するだけで済みます。

関連する問題