Java JVM在启用的协议中选择最新的https协议?

Java JVM在启用的协议中选择最新的https协议?,java,ssl,Java,Ssl,通过JBOSS服务器,我需要连接多个支持不同https.protocols的URL 比如说,, 我需要连接X,它支持TLSv1、TLSv1.1和TLSv1.2,但Java 7在使用TLSv1.2时不支持某些签名,所以我想使用TLSv1或TLSv1.1, 需要连接支持TLSv1的Y, 需要连接支持TLSv1.2的Z 因此,我在JVM中启用了多个https协议来连接所有X、Y和Z: -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 但是当我尝试连接X时,它总是选择TL

通过JBOSS服务器,我需要连接多个支持不同https.protocols的URL

比如说,, 我需要连接X,它支持
TLSv1、TLSv1.1
TLSv1.2
,但Java 7在使用
TLSv1.2
时不支持某些签名,所以我想使用
TLSv1
TLSv1.1
, 需要连接支持TLSv1的Y, 需要连接支持TLSv1.2的Z

因此,我在JVM中启用了多个https协议来连接所有X、Y和Z:

-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
但是当我尝试连接X时,它总是选择
TLSv1.2
。所以我得到了一个错误:

SEND TLSv1.2 ALERT:  fatal, description = handshake_failure
假设我使用不同的3个Java类来实现X、Y和Y的连接,并且这些类可以被多个线程访问(比如10000个线程)

如何为每个类启用这些协议

  • 用于X-TLSv1.1的类
  • Y-TLSv1的类
  • 用于Z-TLSv1.2的类
我觉得这样放不是一个好主意(因为多个线程访问这里和那里): 比如说-X-
System.getProperties().setProperty(“https.protocols”,“TLSv1.1”)


请提供适当的解决方案。提前谢谢。

我想你是用你的密码打X、Y和Z?在这种情况下,您应该能够使用自定义SSLContextFactory,并按照您希望的方式为各个调用进行配置。那么您就不需要系统属性了。如果您使用的是内置的HttpsUrlConnection,那么它有一个setSSLSocketFactory方法,该方法可以针对每个实例而不是全局工作。其他流行的HTTP客户端也有类似的特性

编辑:似乎与X和Z一起工作的示例,请参见下面的注释

    HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();
    SSLContext sslContext = SSLContext.getInstance(tlsVersion);
    sslContext.init(null, null, new SecureRandom());
    conn.setSSLSocketFactory(sslContext.getSocketFactory());
    try (InputStream is = conn.getInputStream()) {
      // Read response
    }

我想你是用你的密码打X,Y和Z?在这种情况下,您应该能够使用自定义SSLContextFactory,并按照您希望的方式为各个调用进行配置。那么您就不需要系统属性了。如果您使用的是内置的HttpsUrlConnection,那么它有一个setSSLSocketFactory方法,该方法可以针对每个实例而不是全局工作。其他流行的HTTP客户端也有类似的特性

编辑:似乎与X和Z一起工作的示例,请参见下面的注释

    HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();
    SSLContext sslContext = SSLContext.getInstance(tlsVersion);
    sslContext.init(null, null, new SecureRandom());
    conn.setSSLSocketFactory(sslContext.getSocketFactory());
    try (InputStream is = conn.getInputStream()) {
      // Read response
    }

当仅支持TLSv1.1的服务器收到TLSv1.2请求时,它应该在响应中使用TLSv1.1。如果它的行为不同,服务器可能有缺陷,可能值得进一步调试以找出问题的确切原因。嗨@Robert,我已经调试过了,实际问题是这个(已经添加了这个问题)-。我发现,对于X,通过Java7,我可以连接到TLSv1。但是如果我对X做了更改,其他2个将受到影响。当仅支持TLSv1.1的服务器收到TLSv1.2请求时,它应该在响应中使用TLSv1.1。如果它的行为不同,服务器可能有缺陷,可能值得进一步调试以找出问题的确切原因。嗨@Robert,我已经调试过了,实际问题是这个(已经添加了这个问题)-。我发现,对于X,通过Java7,我可以连接到TLSv1。但是如果我对X做了更改,其他2个将会受到影响。嗨,我在发布这个问题之前已经试过了。它不起作用。X、Y和Z是公共的,以便我们可以测试,还是它们是内部站点?我猜它们是内在的,因为你保守了它们的秘密,但值得一问。不,它们不是。所有网站都是第三方网站。也许你可以详细说明一下,以便我们进行测试?您好,比如X=netfundstest.com,Y=其他支持TLSv1的域名,Z=siteminder.atlassian.netHi,我在发布这个问题之前已经试过了。它不起作用。X、Y和Z是公共的,以便我们可以测试,还是它们是内部站点?我猜它们是内在的,因为你保守了它们的秘密,但值得一问。不,它们不是。所有网站都是第三方网站,也许你可以详细说明一下,以便我们进行测试?您好,比如X=netfundstest.com,Y=其他支持TLSv1的域名,Z=siteminder.atlassian.net