web-dev-qa-db-fra.com

Activer la suite de chiffrement TLSv1.2 et 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

Je reçois le message d'erreur ci-dessous lorsque j'essaie de me connecter directement au serveur à partir de Client via 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)

Le code ci-dessous active 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 active la suite de chiffrement 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()]));

Après avoir effectué les deux opérations ci-dessus à partir du code Java), je parviens à me connecter au serveur via SSL.

Est-il possible d'activer/forcer TLSv1.2 et TLS_RSA_WITH_AES_256_CBC_SHA256 in Java 7 sans changer aucun Java Code via propriétés, paramètres ou propriétés de débogage??)

J'ai essayé toutes les propriétés ci-dessous dans toutes les formes et combinaisons (activation et désactivation) et j'ai échoué.

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

J'exécute le programme similaire à celui 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 ci-dessous:

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

Tous les indicateurs permettant d’atteindre cet objectif sans Java seraient très appréciés.

18
Ashok Felix

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

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

Voir le post sur http://fsanglier.blogspot.com.es/

Java 7 a introduit le support de TLS v1.2 (voir http://docs.Oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html ) MAIS ne le fait pas l'activer par défaut. En d'autres termes, votre application client doit spécifier explicitement "TLS v1.2" lors de la création de SSLContext, sinon elle ne pourra tout simplement pas l'utiliser.

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

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

Les JRE désactivent toute la cryptographie 256 bits par défaut. Pour l'activer, vous pouvez télécharger les fichiers de stratégie juridictionnelle de force illimitée de JCE (Java Cryptography Extension) ici: http://www.Oracle.com/ technetwork/Java/javase/downloads/index.html

Remplacez les fichiers local_policy.jar et US_export_policy.jar dans votre bibliothèque/security dans le répertoire jre.

8
Humberto Machado

Il semble que le JRE actuel intègre les fichiers de stratégie limités et illimités sous le dossier d'installation de JRE dans lib/security, chacun dans des sous-dossiers séparés. Par défaut, dans lib/security/Java.security, la stratégie limited est utilisée par défaut. Mais si vous décommentez le crypto.policy=unlimited _ line, cela permettra à Java d’utiliser les fichiers de stratégie unlimited et d’activer les algorithmes de chiffrement 256 bits.

2
Kumba