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
Un ancien certificat avec une petite clé
fréquenteAnciens équipements, serveurs web embarqués et certificats de test générés avec des clés RSA de 512 ou 768 bits.
Un certificat de la chaîne signé en MD5 (ou en SHA-1 sous une racine livrée avec le JDK)
occasionnellejdk.certpath.disabledAlgorithms liste aussi MD2, MD5 et SHA-1 pour les chaînes de serveurs TLS qui aboutissent à une AC livrée avec le JDK.
Une mise à jour du JDK a durci les contraintes
occasionnelleLes contraintes sont relevées de temps à autre dans les mises à jour de sécurité ; des certificats acceptés avec une mise à jour plus ancienne peuvent échouer après la mise à niveau.
Comment corriger l’erreur
- 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.
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.
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"