Aller au contenu
ecdsa.com
Java (JDK)Java

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

Comment corriger l’erreur

  1. 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;
    }

Erreurs associées

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