书籍Bulletproof SSL and TLS也表明Java 6支持ECDHE,但有一个警告:
我假设作者所说的v3握手协议是SSLv3?虽然我没有尝试过,但即使这样也不是一种可行的选项,因为存在POODLE漏洞。在服务器上启用并优先使用ECDHE密码套件。Java 6和7客户端支持这些套件,并会愉快地使用它们。(但是请注意,对于Java 6,您必须切换到使用v3握手协议以在客户端级别使用ECDHE密码套件。)
那么我错过了什么呢?
我假设作者所说的v3握手协议是SSLv3?虽然我没有尝试过,但即使这样也不是一种可行的选项,因为存在POODLE漏洞。在服务器上启用并优先使用ECDHE密码套件。Java 6和7客户端支持这些套件,并会愉快地使用它们。(但是请注意,对于Java 6,您必须切换到使用v3握手协议以在客户端级别使用ECDHE密码套件。)
SSLv2Hello
,但不再默认启用,因此默认情况下使用v3格式,或者只要指定协议为(全部)SSL3或更好。7和8还实现了TLS1.1和1.2,而6没有,尽管只有8在客户端上默认启用它们。如果您连接到古老的SSL2-only服务器,则应仅指定SSLv2Hello
- 当然,您应该尽力避免这样做。name = NSS
nssDbMode = noDb
attributes = compatibility
您需要开启-Djavax.net.debug=all并查看发生了什么,并提供示例代码和日志。
在1.6中,SunJSSE支持TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA: http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html#SunJSSEProvider
因此,您应该使用它作为启用的协议设置您的SSLContext。请参阅http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#SSLContext获取详细信息。您还需要交换已启用的协议,以便启用1.2并处于领先地位。
另请参见
根据Chisther B.的答案,这是我遵循的步骤,使Java 1.6与ECDHE配合使用。
下载BouncyCastller (bcprov-jdk15to18-169.jar
),将其复制到$JAVA_HOME/jre/lib/ext
并在$JAVA_HOME/jre/lib/security/java.security
中添加以下配置:
security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider
使用 Oracle JDK_1.6_211 测试了 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 和 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 密码套件。
我的 Dockerfile
COPY bcprov-jdk15to18-169.jar $JAVA_HOME/jre/lib/ext/
COPY java.security.bc.patch ./
RUN patch $JAVA_HOME/jre/lib/security/java.security < java.security.bc.patch
java.security.bc.patch 内容
53a54
> security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider