Aller au contenu
ecdsa.com
Java (PKIX validator)Java

Message d’erreur

java.security.cert.CertPathValidatorException: Algorithm constraints check failed on keysize limits: RSA 768 bit key used with certificate: CN=api.example.com

Également affiché sous la forme

  • Algorithm constraints check failed on keysize limits
  • javax.net.ssl.SSLHandshakeException: (unsupported_certificate) PKIX path validation failed: java.security.cert.CertPathValidatorException: Algorithm constraints check failed on keysize limits

Le type de clé, la taille et le sujet sont renseignés pour chaque certificat. La couche TLS le signale sous la forme « (unsupported_certificate) PKIX path validation failed: … ». Avec un certificat serveur signé en MD5, notre test a échoué plus tôt, avec handshake_failure renvoyé par le serveur, car la JVM ne propose pas du tout de signatures MD5.

Java (PKIX validator) — jdk.certpath.disabledAlgorithms rejects a weak key or signature algorithm in the chain

Ce que cela signifie

Java a construit un chemin de confiance, mais un certificat de ce chemin utilise une clé (ou un algorithme de signature) que jdk.certpath.disabledAlgorithms interdit : la validation du chemin échoue donc. Le message indique l’algorithme, la taille de clé et le sujet du certificat. Les JDK actuels rejettent dans les chaînes de certificats les clés RSA et DSA de moins de 1024 bits, les clés EC de moins de 224 bits et les signatures MD2/MD5.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Trouver le certificat faible

    Affichez la taille de la clé publique et l’algorithme de signature de chaque certificat de la chaîne servie.

    bash
    # Key size and signature algorithm of every certificate the server sends
    openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \
      | awk '/BEGIN CERT/{n++; f="c" n ".pem"} /BEGIN CERT/,/END CERT/{print > f}'
    for f in c*.pem; do openssl x509 -in "$f" -noout -subject -text | grep -E 'subject=|Public-Key|Signature Algorithm' | sort -u; done
  2. 2.

    Réémettre avec une clé moderne

    Une clé ECDSA P-256 ou RSA de 2048 bits ou plus, avec une signature SHA-256, est acceptée partout.

    bash
    # Replace the weak key: ECDSA P-256 (or RSA 2048+) with a SHA-256 signature
    openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:P-256 -nodes -keyout server.key \
      -subj "/CN=api.example.com" -addext "subjectAltName=DNS:api.example.com" -out server.csr
  3. 3.

    Lire les contraintes du JDK

    jdk.certpath.disabledAlgorithms, dans java.security, liste ce qui est rejeté ; il est possible de l’assouplir en surchargeant les propriétés de sécurité, mais cela réadmet des clés qui peuvent être cassées.

    bash
    # What this JDK rejects in certificate chains
    sed -n '/^jdk.certpath.disabledAlgorithms=/,/[^\\]$/p' "$JAVA_HOME/conf/security/java.security"

Erreurs associées

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