es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La clave proporcionada (sun.security.mscapi.CPrivateKey) no es una instancia de RSAPrivateKey (FIRMA DIGITAL)

Así que estoy leyendo el certificado, la clave privada, etc. de un dongle USB y trato de firmar un PDF, pero me da la siguiente excepción:

Exception in thread "main" java.security.InvalidKeyException: La clave suministrada (sun.security.mscapi.CPrivateKey) no es una instancia de RSAPrivateKey
    at org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi.engineInitSign(Unknown Source)
    at java.base/java.security.Signature$Delegate.engineInitSign(Signature.java:1370)
    at java.base/java.security.Signature.initSign(Signature.java:635)
    at com.itextpdf.text.pdf.security.PrivateKeySignature.sign(PrivateKeySignature.java:114)

Aquí estoy usando la biblioteca com.itextpdf.text (MakeSignature, ExternalSignature y algunas otras clases) y esto es lo que mi código principal (main) se ve así:

KeyStore keyStore = KeyStore.getInstance("Windows-MY");
        keyStore.load(null, password.toCharArray());
        InputStream in = new ByteArrayInputStream(keyStore.aliases().nextElement().getBytes(StandardCharsets.UTF_8));
        keyStore.load(in, password.toCharArray());

    String alias = keyStore.aliases().nextElement();
    PrivateKey pk = (PrivateKey) keyStore.getKey(alias, password.toCharArray());
    java.security.cert.Certificate[] chain =  keyStore.getCertificateChain(alias);
    BouncyCastleProvider provider = new BouncyCastleProvider();
    Security.addProvider(provider);
    ExternalDigest digest = new BouncyCastleDigest();

    ExternalSignature signature = new PrivateKeySignature(pk, DigestAlgorithms.SHA1, provider.getName());
    System.out.println(signature.getEncryptionAlgorithm());
    System.out.println(signature.getHashAlgorithm());
    MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null,
            0, MakeSignature.CryptoStandard.CADES);
    pdf.close();
    reader.close();
    os.close();

“`
Lo que quiero saber es ¿dónde está la incompatibilidad? ¿Es entre el algoritmo de la clave privada y el proveedor? ¿O es entre la clase de firma y la clave privada? porque después de todo, obtengo la clave privada del dongle ¡y no puedo cambiarla! Lo cual significaría que necesito cambiar algo más en mi programa.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La incompatibilidad parece estar entre el algoritmo PK y el proveedor. El mensaje de excepción indica claramente que la clave suministrada no es una instancia de RSAPrivateKey, lo cual significa que la clave que se está utilizando no es compatible con el algoritmo RSA utilizado por el motor DigestSignatureSpi del proveedor Bouncy Castle. Esto puede deberse a varias razones, como una discrepancia entre el tipo de clave y el algoritmo, un formato o codificación incorrecta de la clave, o un problema con el controlador o la implementación del dongle USB. Es posible que cambiar el programa o la clase de firmado no solucione el problema, y pueda ser necesario realizar una investigación adicional para identificar y resolver la causa raíz del problema.

Comments are closed.