Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpsServer-强制TLSv1.1_Java_Ssl_Encryption_Ssl Certificate - Fatal编程技术网

Java HttpsServer-强制TLSv1.1

Java HttpsServer-强制TLSv1.1,java,ssl,encryption,ssl-certificate,Java,Ssl,Encryption,Ssl Certificate,我正在运行Java8并使用com.sun.net.httpserver.HttpsServer创建HTTPS服务器。我有一个在Java密钥库中使用可信CA签名EC证书的工作实现 我一直在研究如何限制服务器可以支持哪些密码和协议(类似于在配置中使用“SSLProtocol”和“SSLCipherSuite”的Apache)——主要是通过禁用SHA-1来实施更高级别的安全性 没有人真的应该强迫TLSv1.1超过1.2,但我这样做只是为了证明以下配置是有效的: KeyStore ks = KeySto

我正在运行Java8并使用
com.sun.net.httpserver.HttpsServer
创建HTTPS服务器。我有一个在Java密钥库中使用可信CA签名EC证书的工作实现

我一直在研究如何限制服务器可以支持哪些密码和协议(类似于在配置中使用“SSLProtocol”和“SSLCipherSuite”的Apache)——主要是通过禁用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()

修改密码列表。您可以通过更新
jre/lib/security/java.security
文件来调整它。查找下面这样的条目并进行调整

jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.2, RC4, MD5withRSA, DH keySize < 768, \
EC keySize < 224
jdk.tls.disabledAlgorithms=SSLv3,TLSv1,TLSv1.2,RC4,md5带rsa,DH keySize<768\
EC密钥大小<224

这很好,但是我是否错过了
setProtocols()
setCipherSuites()
以编程方式实现这一点?我可能不一定希望(或有权)在整个服务器上全局更改它。