有时下面的代码会失败,有时它会起作用。我正在使用Java8。这是服务器方面的问题吗?
线程“main”中的异常javax.net.ssl.SSLException:不支持的记录版本Unknown-0.0。
编辑: 我从JDK8降级到JDK7并且它有效。我发现唯一有效的解决方案。
public static void main(String[] args) throws Exception {
URL u = new URL("https://c********.web.cddbp.net/webapi/xml/1.0/");
HttpURLConnection connection = (HttpURLConnection) u.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "text/plain");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", "" + 140);
connection.setUseCaches(false);
DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
}
答案 0 :(得分:8)
在尝试使用强制执行256位加密的SSL连接时,我在新的java安装中收到了相同的错误消息。为了解决这个问题,我发现我需要安装Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files(例如http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html)
答案 1 :(得分:1)
我有这条线
SSLContext sc = SSLContext.getInstance("SSL");
必须将其更改为
SSLContext sc = SSLContext.getInstance("TLSv1");
现在它适用于java 7和java 8
注意:(在java 7 SSL和TLS都使用相同的url,在java 8中只试过TLSv1,但我猜SSLv1也有效)
答案 2 :(得分:1)
根据您的JDK / JRE版本下载Java密码学扩展(JCE)无限强度管辖权策略文件,并将其放在lib / security文件夹中
默认情况下,Java密码扩展在访问功能和算法使用方面受到限制。我们需要使其不受限制。
答案 3 :(得分:0)
根据堆栈跟踪,RecordVersion Unknow-0.0由here生成 => referenced from here => which is invoked in InputRecord.readV3Record
大多数情况下,这两个值不应该是0,这种情况发生的原因可能是服务器在握手时的错误响应。
(这不是一个答案,只是一些信息,以便更容易找出问题和解决方案)