如何在 Java 6 中使用 TLS 1.2

2022-08-31 21:29:43

似乎Java 6支持V1.0的TLS,有没有办法在Java 6中使用TLS 1.2?

也许Java 6的补丁或特定更新将支持它?


答案 1

在使用Oracle JDK 1.6几个小时后,我能够在不更改任何代码的情况下使其工作。Magic 由 Bouncy Castle 完成,用于处理 SSL,并允许 JDK 1.6 默认使用 TLSv1.2 运行。从理论上讲,它也可以应用于旧的Java版本,并最终进行调整。

  1. Java Archive Oracle 网站下载最新的 Java 1.6 版本
  2. 在首选路径上解压缩它,并设置JAVA_HOME环境变量
  3. 使用最新的 Java 加密扩展 (JCE) 无限强度管辖权策略文件更新 JDK 6
  4. 下载弹跳城堡文件 bcprov-jdk15to18-165.jarbctls-jdk15to18-165.jar 并将它们复制到您的文件夹中${JAVA_HOME}/jre/lib/ext
  5. 修改文件,注释掉提供程序部分并添加一些额外的行${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%


答案 2

公共 Oracle Java 6 发行版不支持 TLSv1.2。Java 6 的付费版本(EOL 后)可能支持。(更新 - TLSv1.1从更新111开始可用于Java 1.6;)

联系甲骨文销售人员。

其他替代方案包括:

  • 使用替代的 JCE 实现,如充气城堡。有关如何执行此操作的详细信息,请参阅此答案。它更改默认实现,以便应用程序将透明地使用 BC。(其他答案显示了如何显式使用 BC 实现,但该方法将需要修改打开套接字的应用程序或库代码。SSLSocketFactorySSLSocketFactory

  • 使用 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。(告诉或提醒老板/客户。他们需要知道。