Добрый день.
Столкнулись с такой проблемой.
При вычислении подписи XML документа возникает Exception:
System.Reflection.TargetInvocationException: Адресат вызова создал исключение. --->System.Security.Cryptography.CryptographicException: Нет доступа к карте. Введен неправильный PIN-код.
в CryptoPro.Sharpei.COMCryptography.SignValue(SafeProvHandleCP hProv, Int32 keyNumber, Byte[] rgbHash, Int32 dwFlags)
в CryptoPro.Sharpei.Gost3410CryptoServiceProvider.SignHash(Byte[] hash)
в CryptoPro.Sharpei.Gost3410CryptoServiceProvider.CreateSignature(Byte[] hash)
в CryptoPro.Sharpei.GostSignatureFormatter.CreateSignature(Byte[] rgbHash)
в System.Security.Cryptography.AsymmetricSignatureFormatter.CreateSignature(HashAlgorithm hash)
в System.Security.Cryptography.Xml.SignedXml.ComputeSignature()
в CryptoPro.Sharpei.Xml.CPSignedXmlDetour.ComputeSignature()Причем проблема возникает только для некоторых xml документов и при попытке
второй раз подписать тот же самый xml документ подпись нормально вычисляется и документ подписывается.
Метод, осуществляющий подпись XML документа:private void SignCreature(XmlDocument document, X509Certificate2 certificate)
{
XmlElement element = (XmlElement)document.GetElementsByTagName("FinalPayment", "http://roskazna.ru/gisgmp/xsd/116/PaymentInfo")[0];
if (element == null) return; // Нечего подписывать
document = new XmlDocument();
document.LoadXml(element.OuterXml);
// Подписанный документа
System.Security.Cryptography.Xml.SignedXml signedXml = new System.Security.Cryptography.Xml.SignedXml(document)
{
// Берем код подписи документа
SigningKey = certificate.PrivateKey
};
System.Security.Cryptography.Xml.Reference reference = new System.Security.Cryptography.Xml.Reference
{
Uri = ""
};
reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
reference.AddTransform(new System.Security.Cryptography.Xml.XmlDsigEnvelopedSignatureTransform());
System.Security.Cryptography.Xml.XmlDsigExcC14NTransform xmlDsigExcC14NTransform = new System.Security.Cryptography.Xml.XmlDsigExcC14NTransform();
reference.AddTransform(xmlDsigExcC14NTransform);
signedXml.AddReference(reference);
System.Security.Cryptography.Xml.KeyInfoX509Data keyInfoX509Data = new System.Security.Cryptography.Xml.KeyInfoX509Data(certificate);
keyInfoX509Data.AddSubjectName(certificate.Subject);
var keyInfo = new System.Security.Cryptography.Xml.KeyInfo();
keyInfo.AddClause(keyInfoX509Data);
signedXml.KeyInfo = keyInfo;
signedXml.SignedInfo.CanonicalizationMethod = xmlDsigExcC14NTransform.Algorithm;
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
// Вычисляем подпись
signedXml.ComputeSignature(); // здесь Exception
element.InnerXml = element.InnerXml + signedXml.GetXml().OuterXml;
}
Отредактировано пользователем 19 января 2017 г. 17:07:07(UTC)
| Причина: Не указана