Cómo cambiar el parámetro CSP de RSACryptoServiceProvider

Estoy firmando rsa-sha256 xml usando la clase SignedXML. Pero el problema es que necesito cambiar CSP para admitir sha256.

Así es como estoy seleccionando el certificado,

public X509Certificate2 GetCertificateFromStore()
        {
            X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            st.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection col = st.Certificates.Find(X509FindType.FindByTimeValid, (object)DateTime.Now, false);

            X509Certificate2 x509Certificate =null;
            X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, "Certificate", "Select single certificate to sign", X509SelectionFlag.SingleSelection);
            if (sel.Count > 0)
            {
                X509Certificate2Enumerator en = sel.GetEnumerator();
                en.MoveNext();
                x509Certificate = en.Current;
            }
            st.Close();
            //x509Certificate.s
            return x509Certificate;
        }

Así es como estoy tratando de cambiar el parámetro CSP.

byte[] privateKeyBlob;
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa = cert.PrivateKey as RSACryptoServiceProvider;
            try
            {
                privateKeyBlob = rsa.ExportCspBlob(true);
            }
            catch
            {
                throw new ApplicationException("Private key fails to export");
            }
            // To use the RSA-SHA256 the CryptoAPI needs to select a special CSP: Microsoft Enhanced RSA and AES Cryptographic Provider
            // By reinstantiating a CSP of type 24 we ensure that we get the right CSP.
            CspParameters cp = new CspParameters(24);
            rsa = new RSACryptoServiceProvider(cp);
            rsa.ImportCspBlob(privateKeyBlob);


            signer.SigningKey = rsa;
            signer.KeyInfo = getKeyInfo(signer, cert);

El problema es que estoy usando un token de dispositivo USB y dudo que la clave privada no se pueda exportar. Al exportar arroja un error 'La clave no es válida para su uso en el estado especificado.'.

¿Alguien puede ayudar a hacer esto?

preguntado el 28 de julio de 12 a las 10:07

¿En qué línea se lanza la excepción? -

esta línea privateKeyBlob = rsa.ExportCspBlob(true); -

La excepción se debe a que rsa.CspKeyContainerInfo.Exportable es falso, por lo que la clave privada no se puede exportar.

1 Respuestas

Si alguien interesado aquí es mi solución, terminé usando otra versión nueva de mi CSP de terceros. La versión de CSP que estaba usando era una antigua y cambié a una nueva versión. Ahora la firma está funcionando. Gracias por tu ayuda.

Respondido 30 Jul 12, 13:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.