2017-02-21 20 views
0

Java 8を実行していて、com.sun.net.httpserver.HttpsServerを使用してHTTPSサーバーを作成しています。私は、Java KeyStoreで信頼できるCA署名EC証明書を使用して実装しています。Java HttpsServer - 強制TLSv1.1

私は、サーバーがサポートしている暗号とプロトコル(構成で "SSLProtocol"と "SSLCipherSuite"を使用しているApacheに似ています)をどのように制限できるかを見てきました - 主に使用を無効にすることにより、 SHA-1の

誰もが本当に1.2上TLSv1.1を強制すべきではないが、私はちょうど、以下の構成が機能することのポイントを証明するためにこれをやっている:

KeyStore ks = KeyStore.getInstance("JKS"); 
// Load KeyStore into "ks" 

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
kmf.init(ks, jksPassword.toCharArray()); 

TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
tmf.init(ks); 

SSLContext sc = SSLContext.getInstance("TLS"); 
sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 

HttpsServer hsS = HttpsServer.create(sBind, 0); 
hsS.setHttpsConfigurator(new HttpsConfigurator(sc) { 
    @Override 
    public void configure(HttpsParameters p) { 
    try { 
     SSLContext c = getSSLContext(); 
     SSLEngine e = c.createSSLEngine(); 

     p.setNeedClientAuth(false); 
     p.setProtocols(new String[] { "TLSv1.1" }); 
     p.setCipherSuites(e.getEnabledCipherSuites()); 
     p.setSSLParameters(c.getDefaultSSLParameters()); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
}); 

私だけ「のTLSv1を受け入れるためにsetProtocols()を使用していますが。 1 "の場合、これは" TLSv1.2 "接続を停止するようには見えず、ChromeからIEまでのすべてがまだ" TLSv1.2 "を使用しています。 IEで "TLSv1.2"と "TLSv1.1"の使用を無効にして "TLSv1.0"を有効にしておくと、それでも "TLSv1.0"が機能し、ネゴシエートされます。 setProtocols()メソッドは何もしないようです!

私がこれを働かせたら、私はsetCipherSuites()を使って暗号のリストを修正しようとしていました。

答えて

1

jre/lib/security/java.securityファイルを更新することで調整できます。下のようなエントリを探して、微調整してください。

jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.2, RC4, MD5withRSA, DH keySize < 768, \ 
EC keySize < 224 
+0

これはいいですが、これをプログラムで行うには 'setProtocols()'と 'setCipherSuites()'のポイントがありませんか?私は必ずしもサーバー全体でグローバルに変更したいと思うかもしれません(またはアクセス権を持っているかもしれません)。 – chrixm