如何在 Java 6 中使用 TLS 1.2
似乎Java 6支持V1.0的TLS,有没有办法在Java 6中使用TLS 1.2?
也许Java 6的补丁或特定更新将支持它?
似乎Java 6支持V1.0的TLS,有没有办法在Java 6中使用TLS 1.2?
也许Java 6的补丁或特定更新将支持它?
在使用Oracle JDK 1.6几个小时后,我能够在不更改任何代码的情况下使其工作。Magic 由 Bouncy Castle 完成,用于处理 SSL,并允许 JDK 1.6 默认使用 TLSv1.2 运行。从理论上讲,它也可以应用于旧的Java版本,并最终进行调整。
${JAVA_HOME}/jre/lib/ext
${JAVA_HOME}/jre/lib/security/java.security
# Original security providers (just comment it)
# security.provider.1=sun.security.provider.Sun
# security.provider.2=sun.security.rsa.SunRsaSign
# security.provider.3=com.sun.net.ssl.internal.ssl.Provider
# security.provider.4=com.sun.crypto.provider.SunJCE
# security.provider.5=sun.security.jgss.SunProvider
# security.provider.6=com.sun.security.sasl.Provider
# security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
# security.provider.8=sun.security.smartcardio.SunPCSC
# Add the Bouncy Castle security providers with higher priority
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.2=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
# Original security providers with different priorities
security.provider.3=sun.security.provider.Sun
security.provider.4=sun.security.rsa.SunRsaSign
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.6=com.sun.crypto.provider.SunJCE
security.provider.7=sun.security.jgss.SunProvider
security.provider.8=com.sun.security.sasl.Provider
security.provider.9=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.10=sun.security.smartcardio.SunPCSC
# Here we are changing the default SSLSocketFactory implementation
ssl.SocketFactory.provider=org.bouncycastle.jsse.provider.SSLSocketFactoryImpl
为了确保它正常工作,让我们制作一个简单的Java程序,使用https从一个URL下载文件。
import java.io.*;
import java.net.*;
public class DownloadWithHttps {
public static void main(String[] args) {
try {
URL url = new URL(args[0]);
System.out.println("File to Download: " + url);
String filename = url.getFile();
File f = new File(filename);
System.out.println("Output File: " + f.getName());
BufferedInputStream in = new BufferedInputStream(url.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(f.getName());
int bytesRead;
byte dataBuffer[] = new byte[1024];
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
fileOutputStream.write(dataBuffer, 0, bytesRead);
}
fileOutputStream.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
现在,只需编译DownloadWithHttps.java程序,并使用Java 1.6执行它
${JAVA_HOME}/bin/javac DownloadWithHttps.java
${JAVA_HOME}/bin/java DownloadWithHttps https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar
Windows用户重要提示:此解决方案已在Linux操作系统中进行了测试,如果您使用的是Windows,请替换为.${JAVA_HOME}
%JAVA_HOME%
公共 Oracle Java 6 发行版不支持 TLSv1.2。Java 6 的付费版本(EOL 后)可能支持。(更新 - TLSv1.1从更新111开始可用于Java 1.6;源)
联系甲骨文销售人员。
其他替代方案包括:
使用替代的 JCE 实现,如充气城堡。有关如何执行此操作的详细信息,请参阅此答案。它更改默认实现,以便应用程序将透明地使用 BC。(其他答案显示了如何显式使用 BC 实现,但该方法将需要修改打开套接字的应用程序或库代码。SSLSocketFactory
SSLSocketFactory
使用 IBM Java 6 ...如果适用于您的平台。根据“IBM SDK,Java技术版修复以缓解POODLE安全漏洞(CVE-2014-3566)”:
“TLSv1.1 和 TLSv1.2 仅适用于 Java 6 服务刷新 10、Java 6.0.1 服务刷新 1 (J9 VM2.6) 和更高版本。
但是,我建议升级到Java 11(现在)。Java 6于2013年2月EOL'd,继续使用它存在潜在风险。免费的Oracle Java 8是许多用例的EOL。(告诉或提醒老板/客户。他们需要知道。