【发布时间】:2020-07-06 19:48:11
【问题描述】:
我的代码使用 Branch.io API 即时创建深层链接。它在 2017 年左右工作了至少一年,我不确定它什么时候停止工作。当我尝试连接到位于“https://api.branch.io/v1/url”的 api 时,我收到 SSLException Unsupported record version Unknown-0.0。任何人都知道使用 branch.io API 的 SSL 安全性发生了什么变化以使调用不再有效?如果我能弄清楚发生了什么变化,那么如何解决它应该是显而易见的。
相关的代码如下所示:
HttpURLConnection conn = (HttpURLConnection) new URL("https://api.branch.io/v1/url").openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setFixedLengthStreamingMode(bytes.length);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
out = conn.getOutputStream();
out.write(bytes);
in = conn.getInputStream();
BufferedReader reader =new BufferedReader(new InputStreamReader(in));
【问题讨论】:
-
什么版本的 Java,它有变化吗?任何 sysprops 集,尤其是与 SNI 相关的?我不知道 2017 年,但目前对于缺少(或错误)SNI 的 ClientHello,服务器响应两个(!)无效的“版本 0.0”警报(致命 40 和警告 1)但它正确拒绝(带有 70)版本的 ClientHello低于 1.2,我知道省略 SNI 的(旧)Java 版本就是这种情况。
-
Java 8 并没有改变,我这边的代码库没有任何改变。我不相信,并且设置了 sysprops。
-
尝试使用 sysprop
javax.net.debug=ssl,handshake运行(或者如果您不能这样做,则使用wireshark、tcpdump 或类似工具进行外部捕获)并查看您的客户端是否确实发送了正确的 SNI(其中Java 日志拼写为 server_name)。如果不查看 exact 版本——这方面有一些错误,IIRC 在 j8 的生命周期内,但我不记得细节了。