强制JVM使用某些Cipher进行https连接

我有Java客户端使用https连接到某些Web服务。 客户端的要求之一是,我们应该能够从支持的密码套件列表中进行选择,然后强制客户端使用它们。

从以下页面

  • https.cipherSuites系统属性。 它包含以逗号分隔的密码套件名称列表,用于指定要在此HttpsURLConnection上使用的密码套件。 请参见SSLSocket setEnabledCipherSuites(String [])方法。

但是当我设置这个JVM属性并列出默认密码时。 我得到标准启用的密码列表,与不使用此属性时相同。

我用来列出启用的密码的代码:

SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory(); SSLSocket socket = (SSLSocket) factory.createSocket(); String[] enabledCiphers = socket.getEnabledCipherSuites(); for (String enabledCipher : enabledCiphers) { System.out.println("Enabled Ciphers: " + enabledCipher); } 

使用以下设置属性:

 -Dhttps.cipherSuites=SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_DSS_WITH_DES_CBC_SHA 

有什么建议么?

此系统属性仅影响默认的https客户端代码; 不是密码的整体列表,即使用HttpsURLConnection任何东西都将由https.cipherSuites值控制。

它没有特别好记录 – 它位于sun.net.www.protocol.https的源代码中,并在jsse参考指南中明确指出:

https.cipherSuites系统属性。 它包含以逗号分隔的密码套件名称列表,用于指定要在此HttpsURLConnection上使用的密码套件。

如果你想完全覆盖套接字工厂,你可以创建一个类来做同样的事情 – 这个答案是一个合理的尝试。