【问题标题】:Issues with setting https.protocols System Property for HTTPS connections为 HTTPS 连接设置 https.protocols 系统属性的问题
【发布时间】:2016-03-20 22:12:16
【问题描述】:

我有一个 Java 实现,各种客户端应用程序使用它来连接到第三方系统。这些第三方系统通过 http/https 支持不同的协议。在这种情况下,所有客户端应用程序都托管在我的 Java 实现托管的同一台服务器中。因此,在这种情况下,各种客户端应用程序将各种 https 协议设置为系统属性(例如:System.setProperty("https.protocols", "SSLv3")System.setProperty("https.protocols", "TLS"),当他们使用它连接到那些第三方系统时。

在这里,系统属性在该环境中的所有应用程序之间共享。因此,修改系统属性会导致很多问题。所以,我想知道,

  1. 有没有办法在不使用系统属性的情况下完成这项工作?
  2. 有没有办法设置所有可能的 https.protocols 以便它 支持与第三方建立的任何 http 或 https 连接 系统支持各种协议?

blogs.oracle.com 中提到的每个 JDK 版本支持的协议和算法:

代码:

String responseStr = null;

System.setProperty("https.protocols",http-protocol); // This is set by the client applications. Previously, there was one by one (eg : "SSLv3". Then I changed it to "TLSv1.2,TLSv1.1,TLSv1,SSLv3" assuming it will enable all) 

byteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byteArrayOutputStream.write(requestStr.getBytes());

URL mUrl = new URL(proxy_url);
HttpURLConnection con = (HttpURLConnection) mUrl.openConnection(); // It works fine for the HttpURLConnection when there's no (s)

con.setRequestMethod("POST");
con.setDoOutput(true);
con.setUseCaches(false);
con.setDoInput(true);

con.setRequestProperty("user-agent","Mozilla(MSIE)");
con.setRequestProperty("Accept-Encoding","gzip,deflate");

byteArrayOutputStream.writeTo(con.getOutputStream());

String encodingHeader = con.getHeaderField("Content-Encoding");
InputStream inputStream = null;

if(encodingHeader != null && encodingHeader.toLowerCase().indexOf("gzip") != -1){
    inputStream = new GZIPInputStream(con.getInputStream());
}else {
    inputStream = con.getInputStream();

}

if (inputStream != null) {

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
       byte[] buffer = new byte[4096];
       int length = 0;

       while ((length = inputStream.read(buffer)) != -1) {
           baos.write(buffer, 0, length);
       }

    responseStr = new String(baos.toByteArray());
    baos.close();

 }

我的 Java 版本:1.5

【问题讨论】:

  • 您需要升级。 1.5 十年前问世。
  • 确实如此。但是现在有一个很大的解决方法。所以,我正在寻找当前版本的解决方案
  • 这个问题的答案可能是相关的:superuser.com/questions/747377/… 值得注意的是 Oracle 文档,它显示虽然 Java 1.7 支持 TLS1.2,但默认情况下它对客户端连接是禁用的。
  • ByteArrayOutputStream 在这里浪费时间和空间。

标签: java ssl https


【解决方案1】:

我建议你根本不要设置它。只需让系统与对等方协商即可。它将协商最强的共享协议。

【讨论】:

  • 但是,那么它使用 https.protocol 默认为 jdk 版本对吗?我的意思是,在这种情况下,当我尝试连接到需要更高 https 协议(例如:TLSv1.2)的第三方系统时,由于我的 java 版本不够高,因此不支持它。参考:blogs.oracle.com/java-platform-group/entry/…
  • 它协商双方通用的最高协议。我已经说过了。如果您的 Java 版本不支持对等点的要求,那么再多设置系统属性也不会改变这一点。
  • 是的,我注意到 EJP。但实际上我们遇到了一些没有提及的问题。所以,你是说提 https.protocols 高于 java 版本没用? (我们可以使用它通过较低的协议进行连接吗?)。我真的很感谢你的 cmets。
  • 这正是我所说的。如果对等方需要的版本高于您的 Java 支持的版本,您肯定会遇到问题,但这与提及系统属性无关。如果您需要 TLS 1.2 支持,您唯一的选择就是升级您的 Java 版本。
  • 我明白你在说什么。但是考虑一下我有一个名为“x”的客户端应用程序和另一个使用我的实现的名为“y”的客户端应用程序的情况。假设我的 java 版本是 1.7。应用程序 x 需要 TLSv1.2 来连接第三方,因此,当没有提及协议时,它不会连接,因为 JAVA 1.7 的默认值是 TLSv1。当我们将 http.protocols 设置为 TLSv1.2 时,它可以工作。但它会影响需要另一个协议来连接的其他客户端应用程序“y”。如果我们不提及 https.protocol 它使用 DEFAULT 对吗?不是最好的。
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
相关资源
最近更新 更多