2014-04-27 203 views
6

SSLSocketFactory提供getDefaultCipherSuites(在套接字上默认启用的密码)和getSupportedCipherSuites(如果需要,可以启用密码)。为什么SSLSocketFactory缺少setEnabledCipherSuites?

但是,SSLSocketFactory不会提供setEnabledCipherSuites来配置密码列表一次以提供后续套接字上的首选项。

事实上,我认为制作setEnabledCipherSuitesSSLSocket的一部分确实使炒锅流程复杂化。例如,HttpsURLConnection不提供getSocket,它确实打破了这个流程:

... 
SSLContext context = SSLContext.getInstance("TLS"); 
context.init(null, trustManager.getTrustManagers(), null); 

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); 
connection.setSSLSocketFactory(context.getSocketFactory()); 

我想的一样,可SSLContext说,因为它有一个像getDefaultSSLParametersgetSupportedSSLParameters方法。

我试图想出一个完善的安全工程原因(中)的能力,但我不能。也许这个决定有一个软件工程原因。 (我怀疑有一个很好的理由,而我目前缺乏见识)。

为什么Java缺乏配置SSLSocketFactory的能力?这显然是一个设计决策,我试图理解为什么它是以牺牲图书馆相关部分的安全为代价的。

+0

纯粹是基于意见的,除非你在这里得到一个JSSE设计师,这是不可能的。如果仍然有效,请尝试使用JSSE邮件列表。 – EJP

+0

@EJP - 我不确定我是否同意。声称其纯粹的观点就像说它没有按照它的方式设计(就像随机效应造成的那样)。这是一个软件工程和面向对象领域的设计决策,我有兴趣知道决策背后的基本原理。 – jww

回答

0

为什么Java缺乏配置SSLSocketFactory的能力?

可能是因为允许应用程序更改启用的密码套件被认为是一个坏主意。您可能会争辩说这是一个平台安全问题,而不是应用程序责任,并且某些应用程序能够启用(或禁用)系统管理员已禁用/启用的套件将是一件坏事。

但我不知道,并且我怀疑那些确实会真的知道定期读取StackOverflow的小组人员。

它显然是一个设计决策,

从某种意义上说,是的。但它可能只是那些意外或默认发生的设计决策之一。或者可能是“他们”不认为这个功能会被使用。或者这样做可能有一个合理的安全原因。

无论哪种方式,如果你强烈地感受到这一点,你可以建议这是一个Java增强(例如here),或者工作起来实现你的增强补丁,并提交给OpenJDK的团队。

如果您不觉得提出/实施增强的动机,获得“他们为什么要这样做”的最佳方法是自己问“他们”。 (请分享答案...)