Включить TLSv1.2 и TLS_RSA_WITH_AES_256_CBC_SHA256 Cipher Suite

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 Cipher Suite:

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.

Можно ли включить/принудить TLSv1.2 и TLS_RSA_WITH_AES_256_CBC_SHA256 в Java 7 без изменения какого-либо кода 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, будут высоко оценены.

Ответ 1

Это возможно, только если вы используете простое соединение 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) BUT не включает его по умолчанию. Другими словами, ваше клиентское приложение должен явно указывать "TLS v1.2" при создании SSLContext или иначе просто не сможет его использовать.

Если вам нужно использовать протокол с прямым защищенным сокетом, создайте SSLContext "TLSv1.2" при запуске приложения и используйте вызов SSLContext.setDefault(ctx), чтобы зарегистрировать этот новый контекст как стандартный.

SSLContext context = SSLContext.getInstance("TLSv1.2");
SSLContext.setDefault(context);

Ответ 2

JRE отключает все 256-битные криптоны по умолчанию. Чтобы включить вы можете скачать Расширение Java Cryptography Extension (JCE) Файлы политики политики неограниченной силы здесь: http://www.oracle.com/technetwork/java/javase/downloads/index.html p >

Замените файлы jars local_policy.jar и US_export_policy.jar в каталог lib/security в jre.

Ответ 3

Похоже, что текущий JRE отправляет как ограниченный, так и неограниченный файл политики в папку установки JRE в lib/security, каждый в отдельных подпапках. По умолчанию в lib/security/java.security используется политика limited. Но если вы раскомментируете строку crypto.policy=unlimited, это позволит Java использовать файлы политики unlimited и включить 256-битные шифры/алгоритмы.