Java HttpsServer - 强制TLSv1.1

时间:2017-02-21 11:04:01

标签: java ssl encryption ssl-certificate

我正在运行Java 8并使用com.sun.net.httpserver.HttpsServer创建HTTPS服务器。我在Java KeyStore中使用可信CA签名的EC证书进行了有效的实现。

我一直在研究如何限制服务器可以支持的密码和协议(类似于Apache使用" SSLProtocol"以及" SSLCipherSuite"在配置中) - 主要用于强制执行通过禁用SHA-1来提高安全性。

没有人真的应该强迫TLSv1.1超过1.2,但我只是这样做以证明以下配置有效:

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();
    }
  }
});

即使我使用setProtocols()只接受" TLSv1.1",这似乎也不会停止" TLSv1.2"连接以及从Chrome到IE的所有内容仍然使用" TLSv1.2"。如果我禁用" TLSv1.2"和" TLSv1.1"在IE中,只需离开" TLSv1.0"启用然后它仍然可以工作并协商" TLSv1.0"。 setProtocols()方法似乎无能为力!?!

如果我开始工作,那么我将使用setCipherSuites()修改密码列表。

1 个答案:

答案 0 :(得分:1)

您可以通过更新jre/lib/security/java.security文件进行调整。寻找下面的条目并进行调整。

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