Я пытаюсь подписать XML-файл в C # .NET 3.5 с помощью частного RSA Ключа, сгенерированного OpenSSL .
Вот как я поступил: я преобразовал ключ RSA из формата PEM в формат XML с помощью фреймворка chilkat (www.example-code.com/csharp/cert_usePrivateKeyFromPEM.asp)
С моим ключом XML я теперь могу использовать нативные функции .NET, которые мне больше нравятся. Поэтому я использовал методы, описанные на MSDN .
Итак, в итоге мой исходный код выглядит так:
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
//Load the private key from xml file
XmlDocument xmlPrivateKey = new XmlDocument();
xmlPrivateKey.Load("PrivateKey.xml");
rsaProvider.FromXmlString(xmlPrivateKey.InnerXml);
// Create a SignedXml object.
SignedXml signedXml = new SignedXml(Doc);
// Add the key to the SignedXml document.
signedXml.SigningKey = Key;
// Create a reference to be signed.
Reference reference = new Reference();
reference.Uri = "";
// Add an enveloped transformation to the reference.
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// Add the reference to the SignedXml object.
signedXml.AddReference(reference);
// Compute the signature.
signedXml.ComputeSignature();
// Get the XML representation of the signature and save
// it to an XmlElement object.
XmlElement xmlDigitalSignature = signedXml.GetXml();
// Append the element to the XML document.
Doc.DocumentElement.AppendChild(Doc.ImportNode(xmlDigitalSignature, true));
Подписанный XML, который я получаю с помощью этой функции, выглядит хорошо, у меня есть элемент XML в конце файла, как это должно быть:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>qoGPSbe4oR9e2XKN6MzP+7XlXYI=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>iPQ6IET400CXfchWJcP22p2gK6RpEc9mkSgfoA94fL5UM6+AB5+IO6BbjsNt31q6MB8hR6lAIcnjzHzc5SeXvFP8Py2bqHTYJvcSA6KcKCQl1LiDNt12UwWiKpSkus2p0LdAeeZJNy9aDxjC/blUaZEr4uPFt0kGCD7h1NQM2SY=</SignatureValue>
Проблема в том, что когда я пытаюсь проверить подпись с помощью xmlsec по этому URL: http://www.aleksey.com/xmlsec/xmldsig-verifier.html., я получаю сообщение о том, что подпись недействительна.
Я искал ошибку в своем коде в течение нескольких дней и не могу ее найти. Я начинаю думать, что преобразование из файла PEM в XML может быть проблемой, но я не знаю, как это проверить. Более того, я не нашел другого способа конвертировать в ключ или напрямую использовать файл PEM в .NET.
Кому-нибудь удалось получить действительную подпись в .NET?