Message d’erreur
java.security.InvalidKeyException: No installed provider supports this key: sun.security.rsa.RSAPublicKeyImpl
Également affiché sous la forme
- java.security.InvalidKeyException: No installed provider supports this key: sun.security.ec.ECPublicKeyImpl
- java.security.InvalidKeyException: No installed provider supports this key: sun.security.ec.ed.EdDSAPublicKeyImpl
Le texte qui suit les deux-points est la classe d’implémentation de la clé (`sun.security.rsa.RSAPublicKeyImpl`, `sun.security.ec.ECPublicKeyImpl`, `sun.security.ec.ed.EdDSAPublicKeyImpl`, une classe de Bouncy Castle…). Sur les JDK actuels, une clé `null` échoue plus tôt avec « Key must not be null ».
Java (JDK) — Signature.initVerify / initSign, Cipher.init
Ce que cela signifie
JCA a cherché un fournisseur dont l’implémentation de l’algorithme demandé accepte cet objet clé, et n’en a trouvé aucun. Avec les fournisseurs par défaut, cela signifie presque toujours que la clé et l’algorithme appartiennent à des familles différentes : une clé RSA passée à `SHA256withECDSA`, une clé EC à `SHA256withRSA`, une clé Ed25519 à ECDSA. Le nom de classe en fin de message indique quel type de clé est réellement arrivé.
Pourquoi cela se produit
L’algorithme et le type de clé ne correspondent pas
fréquenteFréquent dans le code JWT qui déduit l’algorithme JCA de l’en-tête du jeton, mais utilise une clé configurée de manière statique : après le passage de l’émetteur de RS256 à ES256, ou lorsque des jetons de deux émetteurs arrivent au même vérificateur.
Une clé Ed25519 ou X25519 traitée comme une clé EC
occasionnelleLes clés Ed25519 sont des clés à courbe elliptique, mais pas des clés ECDSA : elles exigent `Signature.getInstance("Ed25519")` (JDK 15+). Les clés X25519 servent uniquement à l’accord de clé et ne peuvent pas signer du tout.
Un objet clé provenant d’un fournisseur non enregistré
occasionnelleLes clés créées par un fournisseur HSM/PKCS#11 ou par Bouncy Castle ne peuvent être utilisées que par ce fournisseur. S’il n’est pas enregistré (ou si vous demandez l’algorithme à un autre fournisseur), aucun fournisseur n’accepte la clé.
Comment corriger l’erreur
- 1.
Déduire l’algorithme et le confronter à la clé
Associez explicitement les algorithmes JWS autorisés aux noms JCA et refusez les combinaisons où le type de clé ne convient pas : l’échec devient alors une erreur de politique claire plutôt qu’une erreur de recherche de fournisseur.
java static Signature verifierFor(String jwsAlg, PublicKey key) throws GeneralSecurityException { String jca = switch (jwsAlg) { case "ES256" -> "SHA256withECDSAinP1363Format"; case "ES384" -> "SHA384withECDSAinP1363Format"; case "RS256" -> "SHA256withRSA"; case "PS256" -> "RSASSA-PSS"; default -> throw new GeneralSecurityException("algorithm not allowed: " + jwsAlg); }; boolean keyFits = jwsAlg.startsWith("ES") ? key instanceof java.security.interfaces.ECPublicKey : key instanceof java.security.interfaces.RSAPublicKey; if (!keyFits) throw new GeneralSecurityException(jwsAlg + " does not match a " + key.getAlgorithm() + " key"); Signature signature = Signature.getInstance(jca); if (jwsAlg.equals("PS256")) { signature.setParameter(new java.security.spec.PSSParameterSpec("SHA-256", "MGF1", java.security.spec.MGF1ParameterSpec.SHA256, 32, 1)); } signature.initVerify(key); return signature; }