[Suite de chiffrement non prise en charge] [Java SSLSocket]

Aug 27 2020

J'essaie de connecter un serveur via SSLSocket en utilisant le protocole TLSv1.2. Le serveur ne prend en charge que les chiffrements suivants.

  • ECDHE-ECDSA-AES128-GCM-SHA256
  • ECDHE-RSA-AES128-GCM-SHA256
  • ECDHE-ECDSA-AES128-SHA256

Lorsque j'essaie de définir des suites de chiffrement activées, je suis confronté à l'exception suivante :

java.lang.IllegalArgumentException: Unsupported ciphersuite ECDHE-ECDSA-AES128-GCM-SHA256
at sun.security.ssl.CipherSuite.valueOf(Unknown Source) ~[?:1.8.0_74]
at sun.security.ssl.CipherSuiteList.<init>(Unknown Source) ~[?:1.8.0_74]
at sun.security.ssl.SSLSocketImpl.setEnabledCipherSuites(Unknown Source) ~[?:1.8.0_74]

J'avais essayé de remplacer Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 à partir de l'URL suivante sur C:\Program Files\Java\jdk1.8.0_92\jre\lib\security Mais toujours incapable de se connecter au serveur.

URL : https://www.oracle.com/java/technologies/javase-jce8-downloads.html

J'utilise le code suivant pour créer SSLSocket :

protected void openSocket() throws IOException {
    LGR.info("Opening SSL socket to " + addr + ":" + port);
    String[] TLS_SUPPORTED_VERSIONS = new String[] { "TLSv1.2" };
    String[] CIPHER_SUITES = new String[] { "ECDHE-ECDSA-AES128-GCM-SHA256", "ECDHE-RSA-AES128-GCM-SHA256", "ECDHE-ECDSA-AES128-SHA256" };
    try {
        SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(addr, port);
        socket.setEnabledProtocols(TLS_SUPPORTED_VERSIONS);
        socket.setEnabledCipherSuites(CIPHER_SUITES);
        
    } catch (Exception ex) {
        LGR.error("##Exception##", ex);
    } catch (Throwable ex) {
        LGR.error("##Throwable##", ex);
    }
}

Réponses

1 PeterWalser Aug 27 2020 at 16:20

Vous pouvez répertorier les suites de chiffrement prises en charge à l'aide de :

SSLSocketFactory socketFactory = SSLContext.getDefault().getSocketFactory();
for (String cipherSuite : socketFactory.getSupportedCipherSuites()) {
    System.out.println(cipherSuite);
}

L'entrée suivante correspond à la suite demandée : TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.

Vous n'avez plus besoin des fichiers JCE Unlimited Strength Jurisdiction Policy Files :

  • dans Java 8 u151/u152, les fichiers de stratégie étaient inclus dans la distribution Java standard, mais devaient être activés explicitement :Security.setProperty("crypto.policy", "unlimited");
  • depuis Java 8 u161+ (et dans toutes les versions Java à venir), ces fichiers de politique sont inclus et une politique de chiffrement illimitée est activée par défaut.

Vous pouvez le vérifier comme suit : Cipher.getMaxAllowedKeyLength("AES")doit revenir Integer.MAX_VALUElorsque la force illimitée est activée.