【问题标题】:Java HttpsServer - Forcing TLSv1.1Java HttpsServer - 强制 TLSv1.1
【发布时间】:2017-07-10 23:19:19
【问题描述】:

我正在运行 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”。如果我在 IE 中禁用“TLSv1.2”和“TLSv1.1”并且只启用“TLSv1.0”,那么它仍然可以工作并协商“TLSv1.0”。 setProtocols() 方法似乎没有做任何事情!?!

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

【问题讨论】:

    标签: java ssl encryption ssl-certificate


    【解决方案1】:

    您可以通过更新jre/lib/security/java.security 文件来调整它。查找如下条目并进行调整。

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

    【讨论】:

    • 这很好,但我是否错过了setProtocols()setCipherSuites() 能够以编程方式执行此操作的要点?我可能不一定想(或有权)在整个服务器上全局更改它。
    猜你喜欢
    • 2021-11-22
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2020-04-09
    相关资源
    最近更新 更多