我正在运行Java 8并使用com.sun.net.httpserver.HttpsServer
来创建HTTPS服务器。我在Java KeyStore中使用信任的CA签名的EC证书进行工作实现。Java HttpsServer - 强制使用TLSv1.1
我一直在研究如何限制服务器可以支持的密码和协议(类似于在配置中使用“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()
。
这是好的,但我错过了'setProtocols()'和'setCipherSuites()'的要点,能够以编程方式做到这一点?我可能不一定希望(或有权访问)在整个服务器上全局更改它。 – chrixm