У меня есть следующий код для генерации электронных документов (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;