Указан неверный тип провайдера - PullRequest
0 голосов
/ 30 июня 2018

У меня есть следующий код для генерации электронных документов (SUNAT). Я попытался перехватить ключ .pfx с помощью «RSACryptoServiceProvider ()» и «X509Certificate2 ()» переменной «Certificate» для переменной «rsaKey», которая содержит данные (цифровой сертификат, пароль) для шифрования и подписать XML. Но это не позволяет мне сделать это и показывает ошибку «Указан неверный тип провайдера». и ошибка «System.Security.Cryptography.Utils.CreateProvHandle (параметры CspParameters, логическое значение randomKeyContainer) в файле System.Security.Cryptography.Utils.GetKeyPairHelper (параметры ключа CspAlgorithmType, безопасный тип CspPeyey и безопасный ключ, безопасный ключ HHLHD); 1001 *

Я читал в некоторых банках, которые могут быть для компьютера, но я уже удалил сертификаты, которые были в компьютере, кроме того, операционная система Windows 10, и я использую .net 4.6.1. Пожалуйста, ваша помощь очень важна для меня.

var response = new FirmadoResponse();

                var rsaKey = new RSACryptoServiceProvider();

                var certificate = new X509Certificate2();
                certificate.Import(Convert.FromBase64String(request.CertificadoDigital),
                    request.PasswordCertificado, X509KeyStorageFlags.MachineKeySet);

                //===>ERROR
                if (certificate.HasPrivateKey) {
                    rsaKey = (RSACryptoServiceProvider)certificate.PrivateKey;
                }
                else{
                    rsaKey = (RSACryptoServiceProvider)certificate.PublicKey.Key;
                }

            var xmlDoc = new XmlDocument();

            string resultado;

            var betterBytes = Encoding.Convert(Encoding.UTF8,
                Encoding.GetEncoding(Formatos.EncodingIso),
                Convert.FromBase64String(request.TramaXmlSinFirma));

            using (var documento = new MemoryStream(betterBytes))
            {
                xmlDoc.PreserveWhitespace = false;
                xmlDoc.Load(documento);

                var indiceNodo = request.UnSoloNodoExtension ? 0 : 1;

                var nodoExtension = xmlDoc.GetElementsByTagName("ExtensionContent", EspacioNombres.ext)
                    .Item(indiceNodo);
                if (nodoExtension == null)
                    throw new InvalidOperationException("No se pudo encontrar el nodo ExtensionContent en el XML");
                nodoExtension.RemoveAll();

                var signedXml = new SignedXml(xmlDoc) {SigningKey = rsaKey };
                var xmlSignature = signedXml.Signature;

                var env = new XmlDsigEnvelopedSignatureTransform();

                var reference = new Reference(string.Empty);
                reference.AddTransform(env);
                xmlSignature.SignedInfo.AddReference(reference);

                var keyInfo = new KeyInfo();
                var x509Data = new KeyInfoX509Data(certificate);

                x509Data.AddSubjectName(certificate.Subject);

                keyInfo.AddClause(x509Data);
                xmlSignature.KeyInfo = keyInfo;
                xmlSignature.Id = "SignOpenInvoicePeru";
                signedXml.ComputeSignature();

                if (reference.DigestValue != null)
                    response.ResumenFirma = Convert.ToBase64String(reference.DigestValue);
                response.ValorFirma = Convert.ToBase64String(signedXml.SignatureValue);

                nodoExtension.AppendChild(signedXml.GetXml());

                using (var memDoc = new MemoryStream())
                {

                    using (var writer = XmlWriter.Create(memDoc,
                        new XmlWriterSettings {Encoding = Encoding.GetEncoding(Formatos.EncodingIso)}))
                    {
                        xmlDoc.WriteTo(writer);
                    }

                    resultado = Convert.ToBase64String(memDoc.ToArray());

                }
            }
            response.TramaXmlFirmado = resultado;
...