对于仅支持Java 8的服务器TLSv1
,它无法从cent OS建立安全的套接字连接
版
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
资源
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Created by jigar.joshi on 6/10/15.
*/
public class SSLTester {
public static void main(String[] args) throws Exception {
SSLSocketFactory f =
(SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) f.createSocket("efm.sandbox.vovici.com", 443 );
try {
printSocketInfo(socket);
socket.startHandshake();
System.out.println("----------------------------------SUCCESS----------------------------------");
BufferedReader r = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String m = null;
while ((m = r.readLine()) != null) {
System.out.println(m);
}
r.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
System.err.println(e.toString());
}
}
private static void printSocketInfo(SSLSocket s) {
System.out.println("Socket class: " + s.getClass());
System.out.println(" Remote address = "
+ s.getInetAddress().toString());
System.out.println(" Remote port = " + s.getPort());
System.out.println(" Local socket address = "
+ s.getLocalSocketAddress().toString());
System.out.println(" Local address = "
+ s.getLocalAddress().toString());
System.out.println(" Local port = " + s.getLocalPort());
System.out.println(" Need client authentication = "
+ s.getNeedClientAuth());
SSLSession ss = s.getSession();
System.out.println(" Cipher suite = " + ss.getCipherSuite());
System.out.println(" Protocol = " + ss.getProtocol());
}
}
使用相同版本的JVM,它可以在OSX上成功进行握手,在centOS上失败,失败原因是它仅尝试使用TLSv1.2
(JVM
8中的默认设置)并且不尝试使用较低的协议
调试说明:
-Ddeployment.security.TLSv1.0=true
-Ddeployment.security.TLSv1=true
-Ddeployment.security.TLSv1.1=false
-Ddeployment.security.TLSv1.2=false
-Djavax.net.debug=ssl:handshake:verbose
题:
为什么可以TLSv1
在OSX而不是CentOS上进行选择?
如何告诉JVM按特定顺序使用协议,或者如果它考虑版本的顺序,那么我如何告诉JVM也尝试 v1
编辑:
我在JRE上安装了无限强度的JCE策略,这会导致这种情况,如果没有这种效果,它就会起作用,因此OSX和CentOS的区别消失了,我怎么仍能使它起作用?
编辑:
输出量
Socket class: class sun.security.ssl.SSLSocketImpl
Remote address = efm.sandbox.vovici.com/206.132.29.15
Remote port = 443
Local socket address = /10.10.152.143:50376
Local address = /10.10.152.143
Local port = 50376
Need client authentication = false
Cipher suite = SSL_NULL_WITH_NULL_NULL
Protocol = NONE
javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1529)
at sun.security.ssl.SSLSocketImpl.checkWrite(SSLSocketImpl.java:1541)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375)
at SSLTester.main(SSLTester.java:24)
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:980)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)
at sun.security.ssl.SSLSocketImpl.getSession(SSLSocketImpl.java:2225)
at SSLTester.printSocketInfo(SSLTester.java:56)
at SSLTester.main(SSLTester.java:23)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:505)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:961)
... 5 more
javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
尝试将协议限制为仅TLSv1
使用:
-Djdk.tls.client.protocols=TLSv1
有关更多详细信息,请参见此页面:https
:
//docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#descPhase2
希望这可以帮助,
尤里
问题内容: 我有一个使用256位AES加密的应用程序,Java开箱即用不支持。我知道要使其正常运行,我在security文件夹中安装了JCE不限强度的jars。作为开发人员,这对我来说很好,我可以安装它们。 我的问题是,由于将分发此应用程序,最终用户很可能不会安装这些策略文件。让最终用户下载这些文件只是为了使应用程序功能并不是一个有吸引力的解决方案。 有没有一种方法可以使我的应用程序运行而不会覆盖
问题内容: 有人可以向我解释如何安装无限强度管辖权策略文件。我从Oracle网站下载了.jar文件,但安装时遇到了问题。我正在制作的Java程序不断给我这个错误: 问题答案: 您需要确定Java主目录路径(通过Java或在命令行上)。它应该是如下路径: 在Windows上 在Mac OS X上 在* nix上 然后,您需要将下载的和文件复制到目录中:并覆盖同名的现有文件。 更新了05/17/17
问题内容: 建立 Java不为JCE无限强度策略文件提供现成的支持 这样可以防止用户使用AES-256,这是广泛使用的加密标准中最大的密钥大小 不包括策略文件会导致许多问题: 意外的异常 不满意的解决方法 只需安装它们 使用不同的实现 使用可能违反Java许可协议的反射 JRE更新后损坏 安装后混乱 所有这些噪音导致程序损坏和/或错误 题 为什么不提供这些服务,将其视为败类? 问题答案: 事实证明
这个问题的解决方案是简单而且直接的,只是为了给读者做做练习。 -- 标准教科书 由于SSL、HTTP、Apache三者共同对请求进行处理,这使得在支持SSL的web服务器上实现特殊的安全制约变得不那么简单。本节介绍了普通情况下的解决方案,作为找出最终方案的第一步。采用这些方案以前,先要尽量地去理解,不了解其限制和相关性就贸然使用是最糟糕的了。 加密方案和强制性高等级安全 仅使用SSLv2的服务器
标准的好处就是你有充足的选择。如果确实不喜欢现存的标准,你只需等待来年发布一个你喜欢的新标准。 -- A. Tanenbaum, "Introduction to Computer Networks" 作为绪论,本文针对的是熟悉Web、HTTP、Apache的读者而不是安全方面的专家,它不是SSL协议的权威性指南,不讨论在一个组织中管理证书的特殊技术,也没有重要的法定专利声明及摘录和引用限制。但是
所有PC都是兼容的。但是其中一些比另一些更兼容。 -- 无名氏 本文讨论对其他SSL方案的向下兼容性。mod_ssl并不是Apache唯一存在的SSL方案,另外还有四种主要的产品:Ben Laurie的免费的Apache-SSL(出现在1998年,与mod_ssl同源),RedHat商业化的Secure Web Server(基于mod_ssl),Covalent商业化的Raven SSL Mod