Activer TLSv1.2 and 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

je reçois l'erreur ci-dessous lorsque j'essaie de me connecter au serveur depuis le Client via SSL directement:

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)

le code ci-dessous permet TLSv1.2

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

le code ci-dessous permet TLS_RSA_WITH_AES_256_CBC_SHA256 suite de chiffrement:

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()]));

après avoir fait les deux à partir du code Java ci-dessus, je suis capable de me connecter au serveur avec succès via SSL.

est-il possible d'activer/forcer TLSv1.2 et TLS_RSA_WITH_AES_256_CBC_SHA256 en Java 7 sans changer de Code Java par le biais de propriétés, de paramètres ou D'Accessoires de débogage?

j'ai essayé toutes les propriétés ci-dessous sous toutes les formes et combinaisons (activer et désactiver) et j'ai échoué.

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

je suis l'exécution du programme similaire à ci-dessous:

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 contient le code suivant:

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();
    }
  }
}

tout pointeur indiquant comment y parvenir sans modification du code Java serait très apprécié.

14
demandé sur jww 2015-10-12 22:53:46

3 réponses

cela n'est possible que si vous utilisez une simple connexion HTTPS (pas de Sockets SSL) en utilisant les propriétés

-Dhttps.protocols=TLSv1.2 
-Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256
http://fsanglier.blogspot.com.es/

Java 7 introduit le support pour TLS v1.2 (voir http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html) MAIS ne pas l'activer par défaut. En d'autres termes, votre application client doit spécifier explicitement " TLS v1.2" at SSLContext la création, ou autrement ne sera tout simplement pas en mesure de l'utiliser.

si vous avez besoin d'utiliser directement le protocole de socket sécurisé, créez un "TLSv1.2" SSLContext au démarrage de l'application et utilisez le SSLContext.setDefault(ctx) appelle pour enregistrer ce nouveau contexte comme étant le contexte par défaut.

SSLContext context = SSLContext.getInstance("TLSv1.2");
SSLContext.setDefault(context);
14
répondu pedrofb 2018-03-03 00:36:30

Le Jre désactiver tous les 256-bit de chiffrement par défaut. Pour l'activer, vous pouvez télécharger Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Fileshttp://www.oracle.com/technetwork/java/javase/downloads/index.html

Remplacer local_policy.jar et US_export_policy.jar les fichiers jars dans votre lib / security dans le répertoire jre.

7
répondu Humberto Machado 2017-06-02 12:39:35

on dirait que le vaisseau courant de JRE contient à la fois les fichiers limités et illimités sous le dossier d'installation de JRE dans lib/security, chacun dans des sous-dossiers distincts. Par défaut,lib/security/java.security, le limited stratégie est utilisée par défaut. Mais si vous décommentez le crypto.policy=unlimited line, qui permettra à Java d'utiliser le unlimited les fichiers de politique et activer les algorithmes / chiffreurs 256 bits.

2
répondu Kumba 2017-11-28 19:04:39