2016-02-12 3 views
6

Oracleのマニュアルは、Java 8がSNIを自動的かつデフォルトで送信したことを示しているようです。 Wiresharkはそれ以外の場合を示します。私はPowerShellのシステム管理者であり、Java開発者ではないので、私は何かを見落としていることに近いです。Java 8でサーバー名表示(SNI)を送信するようにHttpsURLConnectionを設定することができます。

適切な信頼キーストアと共に使用すると、次のコードはSNIを必要としないすべてのSSL Webサイトからステータス200を返します。また、複数のホストのApacheサーバーのデフォルトのSSL Webサイトに接続するとうまくいきます。ただし、デフォルト以外のサイトに接続するように要求された場合、デフォルトのサイトに接続するため、サイト名と一致しない証明書名では失敗します。

import java.util.*; 
import java.net.*; 
import javax.net.ssl.*; 
import java.io.*; 

public class testJavaHttpConn { 
    public static void main(String[] args) throws Exception { 
     String strUrl = args[0]; 
     System.out.println("Trying to connect to " + strUrl); 
     try { 
      URL url = new URL(strUrl); 
      HttpsURLConnection urlConn = (HttpsURLConnection) url.openConnection(); 
      System.out.println("Connecting"); 
      urlConn.connect(); 
      System.out.println("Done"); 
      System.out.println("Response " + urlConn.getResponseCode()); 
     } catch (IOException e) { 
      System.err.println("Error creating HTTP connection"); 
      e.printStackTrace(); 
      throw e; 
     } 
    } 
} 

IましないセットするSystem.setProperty( "jsse.enableSNIExtension"、 "偽"); -Djavax.net.debug = sslと設定すると、サーバ名の拡張子が設定されていないことが明確に示されます。

私は、抽象度の次の深い層に飛び込みたいなら、SSLSocketを実装してSSLParameter serverNameを設定することができますが、それを避けたいと思います。

編集:このコードは、コメントでFloに対して上記のように動作します。 Linux 2.6.18-194.11.3.el5では1.8.0_72、Windows 7では1.8.0_51で失敗しています.Windowsのインストールはバニラですが、Linuxのインストールではsecurerandom.source = file: /dev/./urandom。私の設置がFloとどのように違うのかを私がどのように判断できるかはわかりません。

+0

だから以外の方法を探しています[ここに記載されています](https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExtension)? –

+0

私は無知によって制限されています。 SSLSocketを使用したコードスニペットは、前後のすべてのものを構築する知識を前提としています。 SSLSocketを使用して接続および取得を実行し、出力を同じオブジェクトHttpURLConnectionに変換する方法を示す例はまだ見つかりませんでした。私はそれらのスニペットごとにすべてのオブジェクトを構築しましたが、一度それらを持つと何もできません。私の無知を考えると、HttpsURLConnectionがSNIを送信する原因となる単純なプロパティをどこか見落としているかどうかを尋ねることが賢明に思えました。答えがいいえの場合は、SSLSocketです。 – codepoke

+1

私はあなたのコードを "https://sni.velox.ch"を使ってテストし、デバッグは '拡張サーバ名、サーバ名:[タイプ=ホスト名(0)、値= sni.velox.ch]'と言っています。 'System.setProperty(" jsse.enableSNIExtension "、" false ")を使用すると、(予想どおり)エラーが発生し、デバッグ時にエクステンションが表示されません。システム:Ubuntu Linux、Java 1.8.0_72(ただし、1.7.0_95でも動作)悲しいことに、私には解決策がありません。 – flo

答えて

3

のHttpsURLConnection は、デフォルトではSNIを送信し、 IFFボックスのうち、それが接続だ先のURLは、完全修飾名ですありません。ローカルイントラネットショートネームエイリアスのSNIは送信しません。

Extension server_name, server_name: [type=host_name (0), value=site.company.com] 

(記録のために、私も短いと完全修飾名のためにSANを使用して新しい証明書を展開する必要が、それは些細だった。)

関連する問題