我正在運行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