2016-11-28 15 views
1

SNIをサポートしているクライアントのみを受け付けるTLSを使用してサーバーを呼び出そうとしています。Java 7でSNIを有効にできません

私は、Java 7を使用してクライアントを実行している:

$ java -version 
java version "1.7.0_80" 
Java(TM) SE Runtime Environment (build 1.7.0_80-b15) 
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode) 

それはデフォルトで有効になっていますが、する必要があります。

  • 私のようにそれを見ることができない
  • を "それは動作しません"ログ内の内線番号

例:

012私は

Extension server_name, server_name: [host_name: my.servername.com] 

を見つけることを期待しながら

Compression Methods: { 0 } 
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1} 
Extension ec_point_formats, formats: [uncompressed] 
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA256withDSA, SHA224withECDSA, SHA224withRSA, SHA224withDSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA 
Extension renegotiation_info, renegotiated_connection: <empty> 
*** 

私は成功せず、確かにフラグ-Djsse.enableSNIExtension=trueを追加しようとしました。

私はネッティー4.0.37を使用してテストを行うと、この例外を取得しています:

io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: handshake_failure 
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:442) 
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:248) 

のJava 7 JVM上でSNIを有効にするトリックは何ですか?

答えて

5

問題はNetty/SSLエンジンの設定上でした。

それはこのように構成することが同類を使用:このように構成されたときに実際に、それが明示的にターゲットサーバ名の設定、作業している

public void initChannel(SocketChannel ch) throws Exception { 
    SSLEngine sslEngine = SSLContext.getDefault().createSSLEngine(); 
    sslEngine.setUseClientMode(true); 
    ch.pipeline() 
     .addLast("ssl", new SslHandler(sslEngine)); 
} 

:この構成では

public void initChannel(SocketChannel ch) throws Exception { 
    SslContext sslContext = SslContextBuilder.forClient().build(); 
    ch.pipeline() 
     .addLast(
      sslContext.newHandler(
       ch.alloc(), 
       host, 
       port 
     ) 
    ); 
} 

を、そこにあるべきログ内(-Djavax.net.debug=allフラグが設定されている):

Extension server_name, server_name: [type=host_name (0), value=target.hostname.com] 
関連する問題