Aller au contenu
ecdsa.com
Java (JSSE)Java

Message d’erreur

No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

Également affiché sous la forme

  • javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

Le libellé est le même depuis les mises à jour du JDK 8 jusqu’au JDK 25. Lorsqu’une JVM joue le rôle de serveur, la même situation apparaît sous la forme « No appropriate protocol » quand ses propres protocoles sont tous désactivés.

Java (JSSE) — the client itself has no enabled protocol/cipher combination left

Ce que cela signifie

La JVM n’a même pas pu construire un ClientHello : après le retrait de tous les protocoles et de toutes les suites de chiffrement listés dans jdk.tls.disabledAlgorithms, il ne reste rien de ce que l’application a demandé. En général, le code ou la configuration exige TLS 1.0, TLS 1.1 ou SSLv3, tous désactivés dans les JDK actuels. Rien n’a été envoyé au serveur.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Trouver où l’ancien protocole est demandé

    Cherchez des noms de protocoles explicites dans le code et dans les options de la JVM ; -XshowSettings:security:tls affiche ce que le JDK a activé.

    bash
    grep -rnE 'SSLContext.getInstance\("(TLSv1|TLSv1\.1|SSL)"\)|setEnabledProtocols|https\.protocols' src/
    java -XshowSettings:security:tls -version 2>&1 | sed -n '/Enabled Protocols/,/Enabled Cipher/p'
  2. 2.

    Demander « TLS » et laisser JSSE négocier

    SSLContext.getInstance("TLS") active TLS 1.3 et 1.2 sur les JDK actuels.

    java
    // Let JSSE negotiate the best version (TLS 1.3 / 1.2)
    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(null, null, null);
  3. 3.

    En dernier recours : une dérogation ciblée pour un seul point de terminaison ancien

    Si un équipement ne peut pas être mis à niveau, un fichier de propriétés de sécurité distinct peut retirer TLSv1/TLSv1.1 de jdk.tls.disabledAlgorithms pour la JVM qui communique avec lui. Partez de la valeur actuelle complète du JDK, ne modifiez que les entrées de protocole et isolez cette JVM.

    bash
    # Last resort for ONE legacy endpoint: take this JDK's own value and drop only TLSv1/TLSv1.1
    v=$(sed -n '/^jdk.tls.disabledAlgorithms=/,/[^\\]$/p' "$JAVA_HOME/conf/security/java.security" | sed 's/\\$//' | tr -d '\n')
    printf '%s\n' "$v" | sed -E 's/ TLSv1(\.1)?,//g' > legacy-tls.security
    java -Djava.security.properties=legacy-tls.security -jar legacy-client.jar

Erreurs associées

Parcourir toute la base de données des erreurs de signature