我正在编写一个Java TLS客户端。关于如何最安全地使用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可用”。
当我问优先顺序时,我是问如果多个事情都被列为“默认值”,哪一个实际上会被用作第一优先级?当然,我读过这篇文章。
正如#11504173(编辑后)所说,所有上下文都可以支持所有协议,尽管默认值可能有所不同。
没有“先后顺序”;对于Java实现的所有协议(SSLv3和三个TLSE),客户端声明它支持的最大协议版本,服务器选择它自己的最大协议版本或客户端提供的较低的协议版本,给出两个对等体支持的最高版本。如果客户端提供的最大值对于服务器来说低得不能接受,服务器将拒绝Hello。如果服务器选择的最大值对于客户端来说是不可接受的低,客户端将中止握手。特别是Java客户机抛出一个异常,比如“服务器协议x不允许”,套接字没有连接。
然而,一些服务器软件没有正确地实现这种协商,并且不会协商低于最大值但仍可接受的版本。为了应对这一点,如果握手失败(一些?)浏览器再次尝试错误地声明较低的最大值;允许狮子狗攻击。浏览器开发人员已经了解到,网页用户大多不想要安全,他们现在只想要他们的跳舞猫视频;Java用户似乎没有那么鲁莽(到目前为止),除了协议指定的方式和您的配置允许的范围之外,Java不会降级。
您可能想到的是ciphersuites,其中客户端确实发送了一个名义上按偏好排序的列表,服务器可以根据该偏好选择“最佳”共享密码,但并不需要这样做。事实上,在野兽恐慌期间,许多服务器被配置为优先使用RC4,即使客户端没有首先列出它。结果发现,BEAST并不是什么问题,而RC4的弱点比之前想象的要糟糕得多,但一些服务器继续强制使用现在已经几乎崩溃的RC4,尽管客户机并不喜欢它,https://tools.ietf.org/html/rfc7465说您根本不应该使用RC4,更不应该使用它。保安不好玩吗?
还有,既然可以指定要使用的安全提供程序,那么我应该使用哪个提供程序呢? 谢谢
Java版本:JDK-8.0.144 参考: nosuchAlgorithmException:SSL_TLSv2 SSLContext不可用#我使用的是tomcat而不是websphere,所以第2点的答案不太相关。 https://community.hitachivantara.com/s/question/0d52s00007thjo2sae/how-to-fix-tls-sslconte
问题是当我启用'时,在我看到的日志中,我的客户机正在使用TLSv1,而我的服务器正在通过SSLv3进行正确的通信。下面是原木的样子, 当我打印支持的协议时,我看到“SSLv3,TLSV1”,因此我猜客户端显示的是更高版本的协议。 但这里的问题是我如何限制客户端只使用“SSLv3”。我还尝试设置。但这也无济于事。 提前道谢。 维姬
如何在接口中使用插入自定义?
在测试我的客户机-服务器分布式系统时,我最初惊讶地得知TLS的默认JSSE实现不进行主机名验证。我在这个问题中尝试了公认的答案,但我的用例有点不同。我使用RabbitMQ的连接工厂,它抽象了SSLSocket的构造。我只是为连接工厂提供了一个SSLContext。我确实找到了很多关于HTTPS的信息,甚至还有一些其他协议,但并不是总能使用的通用协议,即使是自定义协议。 但是,除了使用之外,关于创建
SSLHandler类在多个线程中使用,如下所示: 因此,为每个新线程创建一个SSLHandler。为了避免这种情况,我考虑使用单例模式重构SSLHandler: