c # — проверка подписанного XML

#c# #xml #asp.net-mvc #signedxml

#c# #xml #asp.net-mvc #signedxml

Вопрос:

У меня проблема с проверкой подписанного XML. Может быть, вы сможете мне помочь 🙂

У меня есть ASP.NET Служба MVC, которая получает XML, и мне нужно проверить, действительна ли подпись в этом XML.

Сертификат, который я использую для проверки, выглядит следующим образом:

файл cert.crt:

 -----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIFALVBJRQwDQYJKoZIhvcNAQEFBQAwaTELMAkGA1UEBhMCREUxDz ............
-----END CERTIFICATE-----
  

Мой код для проверки подписи:

 var xmlDoc = new XmlDocument { PreserveWhitespace = true };
xmlDoc.LoadXml(samlXML);

var signedXml = new SignedXml(xmlDoc);

var certPath = HostingEnvironment.MapPath(@"~/App_Data/cert.crt");
var readAllBytes = File.ReadAllBytes(certPath);

X509Certificate2 certificate = new X509Certificate2(readAllBytes);

XmlNodeList signatureElement = xmlDoc.GetElementsByTagName("ds:Signature");
signedXml.LoadXml((XmlElement)signatureElement[0]);

var isValid = signedXml.CheckSignature(certificate, true);
  

XML подписывается :

 <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
  

Эта строка

 X509Certificate2 certificate = new X509Certificate2(readAllBytes);
  

Выдает ошибку

 Object was not found.
  

Что я делаю не так?

Комментарии:

1. Проверяли ли вы CertPath, правильный ли он и находится ли там файл?

2. @ShinoLex да, строка var readAllBytes = File.ReadAllBytes(certPath); работает нормально

Ответ №1:

Согласно документам, массив байтов должен быть либо в двоичной кодировке (формат DER), либо в кодировке X.509 в формате Base64. У вас есть что-то еще на руках, поэтому конструктор не может обработать ваши данные.

Проверьте документы для получения дополнительной информации.