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

时间:2015-12-07 14:39:37

标签: java ssl

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

来自以下page

  
      
  • 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

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

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

它没有特别好记录 - 它位于sun.net.www.protocol.https的来源中,并且在the jsse reference guide明确地被提及:

  

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

如果你想完全覆盖套接字工厂,你可以创建一个类来做同样的事情 - this answer做出合理的尝试。