我正在编写一个Java客户端。关于如何最安全地使用SSLContext类,以便在可能的情况下使用TLS,以及只有在TLS不可用时才使用SSLv3,我有几个问题。(附带注意:我看到文档中说,由于某些供应商产品的不兼容性问题,TLS1.1和TLS1.2对客户是禁用的)。
SSLContext.getInstance("SSL")
只使用SSL协议还是在可用的情况下使用TLS协议?SSLContext.getInstance("SSL")
时,默认协议是什么?它们的优先级是多少?SSLContext.getInstance("TLS")
只使用TLS协议还是在可用的情况下使用SSL协议?SSLContext.getInstance("TLS")
时,默认协议是什么?它们的优先级是多少?Java文档在许多方面都不清楚。例如,它说“选择TLSv1可能会使1.0、1.1和1.2可用”。
SSLContext.getInstance("TLSv1")
,SSLv3是不可用的还是不是默认的?当我询问优先级的顺序时,我问的是,如果多个事物都被列为“缺省值”,那么哪一个实际上将被用作第一优先级呢?当然,我也读过this thread。
发布于 2015-08-19 09:21:33
正如#11504173 (编辑后)所说,所有上下文都可以支持所有协议,尽管默认的可能有所不同。
没有“优先级顺序”;对于所有由Java实现的协议(SSLv3和三个TLSes),客户端都会声明它支持的最大协议版本,而服务器选择自己的最大版本或客户端的报价(以较低者为准),从而使获得两个对等点支持的最高版本。如果客户端提供的max值对于服务器来说低得令人无法接受,服务器将拒绝hello。如果服务器选择的最大值对于客户端来说低得令人无法接受,客户端将中止握手。特别是,Java客户端抛出一个异常,类似于“不允许服务器协议x”,并且套接字没有连接。
然而,一些服务器软件没有正确地实现这个协商,并且不会协商低于最大值但仍然可以接受的版本。为了应付这种情况,如果握手失败(有些?)浏览器再次错误地声明一个较低的最大值;这允许贵宾犬攻击。浏览器开发人员已经了解到,web用户大多不想要安全性,他们现在只想要跳舞的猫视频;Java用户似乎不那么鲁莽(到目前为止),Java没有降低等级,只是按照协议规定的方式和配置所允许的范围。
您可能会想到密码套件,其中客户端确实发送了一个按偏好排序的列表,而服务器可以根据该首选项选择“最佳”共享密码,但这并不是必需的。事实上,在恐慌期间,许多服务器被配置为优先使用RC4,即使客户机没有首先列出它。后来发现,虽然RC4的弱点比之前想象的要严重得多,但它并不是什么大问题,但一些服务器继续强制使用现在几乎已经坏掉的RC4,尽管客户不喜欢它,而且https://www.rfc-editor.org/rfc/rfc7465说你根本不应该使用RC4,更不喜欢它。安全不是很有趣吗?
https://stackoverflow.com/questions/31754876
复制相似问题