启用TLSv1.2和TLS_RSA_WITH_AES_256_CBC_SHA256密码套件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启用TLSv1.2和TLS_RSA_WITH_AES_256_CBC_SHA256密码套件相关的知识,希望对你有一定的参考价值。

Server: 
TLS Version: v1.2
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA256 

Client:
JRE 1.7

当我尝试通过SSL直接从客户端连接到服务器时,我收到以下错误:

Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)

以下代码启用TLSv1.2

  Set<String> enabledTLSSet = new HashSet<String>(Arrays.asList(sslsocket.getEnabledProtocols()));
  enabledTLSSet.add("TLSv1.2");      
  sslsocket.setEnabledProtocols(enabledTLSSet.toArray(new String[enabledTLSSet.size()]));

以下代码启用了TLS_RSA_WITH_AES_256_CBC_SHA256密码套件:

Set<String> enabledCipherSuitesSet = new HashSet<String>(Arrays.asList(sslsocket.getEnabledCipherSuites()));
      enabledCipherSuitesSet.add("TLS_RSA_WITH_AES_256_CBC_SHA256");
      sslsocket.setEnabledCipherSuites(enabledCipherSuitesSet.toArray(new String[enabledCipherSuitesSet.size()]));

从Java代码执行上述两项操作后,我可以通过SSL成功连接到服务器。

是否可以在Java 7中启用/强制TLSv1.2TLS_RSA_WITH_AES_256_CBC_SHA256而无需通过属性,参数或调试道具更改任何Java代码?

我尝试了所有形式和组合(启用和禁用)以及失败的所有以下属性。

-Dhttps.protocols=TLSv1.2
-Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256
-Ddeployment.security.TLSv1.2=true

我正在执行类似下面的程序:

java -jar -Dhttps.protocols=TLSv1.2 -Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256 Ddeployment.security.TLSv1.2=true -Djavax.net.debug=ssl:handshake SSLPoker.jar <SERVER> 443

SSLPoker包含以下代码:

package com.ashok.ssl;

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;

/**
 * Establish a SSL connection to a host and port, writes a byte and prints the response - Ashok Goli. See
 * http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services
 */
public class SSLPoke {

  /**
   * The main method.
   * Usage: $java -jar SSLPoker.jar <host> <port>
   *
   * @param args the arguments
   */
  public static void main(String[] args) {
    if (args.length != 2) {
      System.out.println("Usage: " + SSLPoke.class.getName() + " <host> <port>");
      System.exit(1);
    }
    try {
      SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
      SSLSocket sslsocket =
          (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1]));

      InputStream in = sslsocket.getInputStream();
      OutputStream out = sslsocket.getOutputStream();

      // Write a test byte to get a reaction :)
      out.write(1);

      while (in.available() > 0) {
        System.out.print(in.read());
      }
      System.out.println("Successfully connected");

    } catch (Exception exception) {
      exception.printStackTrace();
    }
  }
}

如果没有Java代码更改如何实现这一点的任何指针将非常感激。

答案

只有使用属性时才使用简单的HTTPS连接(而不是SSL套接字)

-Dhttps.protocols=TLSv1.2 
-Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256

请参阅http://fsanglier.blogspot.com.es/的帖子

Java 7引入了对TLS v1.2的支持(参考http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html)但默认情况下不启用它。换句话说,您的客户端应用程序必须在创建SSLContext时明确指定“TLS v1.2”,否则将无法使用它。

如果需要使用直接安全套接字协议,请在应用程序启动时创建“TLSv1.2”SSLContext,并使用SSLContext.setDefault(ctx)调用将该新上下文注册为默认上下文。

SSLContext context = SSLContext.getInstance("TLSv1.2");
SSLContext.setDefault(context);
另一答案

JRE默认禁用所有256位加密。要启用,您可以在此处下载Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files:http://www.oracle.com/technetwork/java/javase/downloads/index.html

将local_policy.jar和US_export_policy.jar jars文件替换为jre目录中的lib / security。

另一答案

看起来当前的JRE既发布了lib/security中JRE安装文件夹下的有限和无限制的策略文件,每个文件都位于不同的子文件夹中。默认情况下,在lib/security/java.security中,默认使用limited策略。但是如果你取消注释crypto.policy=unlimited行,那将允许Java使用unlimited策略文件并启用256位密码/算法。

以上是关于启用TLSv1.2和TLS_RSA_WITH_AES_256_CBC_SHA256密码套件的主要内容,如果未能解决你的问题,请参考以下文章

为Java Applet启用TLSv1.2

启用 TLSv1.2 和 TLS_RSA_WITH_AES_256_CBC_SHA256 密码套件

启用TLSv1.2和TLS_RSA_WITH_AES_256_CBC_SHA256密码套件

window服务器禁用默认的ssl2.0和ssl3.0只启用启用tls1.2保证安全

如何在 Nginx 中启用 TLS 1.2?

如何在 Java 7 中启用 TLS 1.2