如何在 Java 6 中使用 TLS 1.2

新手上路,请多包涵

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

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

原文由 alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
1 个回答

在使用 Oracle JDK 1.6 几个小时后,我能够在不更改任何代码的情况下使其工作。神奇的是 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. 下载 Bounce Castle jar 文件 bcprov-jdk15to18-1.72.jarbctls-jdk15to18-1.72.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%

原文由 Wellington Souza 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题