2015-12-07 41 views
2

我有Java客戶端,它使用https連接到某些Web服務。客戶端的一個要求是,我們應該能夠從支持的密碼套件列表中進行選擇,然後強制客戶端使用它們。強制JVM使用某些Cipher進行https連接

從以下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 

有什麼建議?

回答

3

此係統屬性僅影響默認的https客戶端代碼;不是密碼的總體列表,即使用HttpsURLConnection的任何內容都將受https.cipherSuites值的控制。

它不是特別有據可查 - 這是在sun.net.www.protocol.https源,並對其進行了明確的the jsse reference guide叫了一聲:

https.cipherSuites系統屬性。其中包含密碼套件名稱的逗號分隔列表,指定啓用此HttpsURLConnection的哪些密碼套件。

如果您想要覆蓋整個套接字工廠,您可以創建一個類來執行相同的操作 - this answer會做出合理的嘗試。