Wie kann ich in einem digital signierten (von .NET 9) XML -Dokument das Präfix im generierten <Sypeatur> -Tag ändern, ohC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann ich in einem digital signierten (von .NET 9) XML -Dokument das Präfix im generierten <Sypeatur> -Tag ändern, oh

Post by Anonymous »

Ich verwende C# mit .NET 9 und muss ein XML -Dokument mit einem X.509 -Zertifikat digital unterschreiben. Der Unterzeichnungsprozess selbst funktioniert perfekt. Ich habe jedoch eine sehr spezifische Anforderung erhalten: Das -Tag, das beim Berechnen der Signatur automatisch von .NET generiert wird, muss aus irgendeinem Grund ein Sch: Präfix haben, und auch der Namespace muss anders sein. Eine einzelne Codezeile macht jedoch die Signatur ungültig, dh: < /p>

Code: Select all

signedXmlWithSchPrefix.SetAttribute("xmlns:sch", customNamespace);
Ich muss dies tun, um den Namespace in die benutzerdefinierte zu ändern. Da ich das Tag nach seiner Erstellung nicht ändern kann, kann ich mir nur vorstellen, dass dies funktionieren würde, wenn .NET das Tag nach meinen Anforderungen generiert. < /P>
Hier ist meine aktuelle Implementierung: < /p>

Code: Select all

public static string SignWithCertificate(string xmlFilePath, string certThumbprint)
{
// Busca o certificado
X509Certificate2 cert = GetCertificateFromLocalMachine(certThumbprint);

if (cert == null || !cert.HasPrivateKey)
throw new Exception("Certificado não encontrado.");

// Faz o parse do XML
XmlDocument xmlDoc = new() { PreserveWhitespace = true };
xmlDoc.LoadXml(File.ReadAllText(xmlFilePath));

if (xmlDoc.DocumentElement == null)
throw new ArgumentException("Falta o elemento raíz do documento XML.");

// Define o prefixo e namespace no documento ANTES de assinar
string customPrefix = "sch";
string customNamespace = "http://www.ans.gov.br/padroes/tiss/schemas";
XmlNamespaceManager nsManager = new(xmlDoc.NameTable);
nsManager.AddNamespace(customPrefix, customNamespace);

// Adiciona as referências/transforms
Reference reference = new() { Uri = "" };
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());

// Prepara a assinatura
SignedXml signedXml = new(xmlDoc) { SigningKey = cert.GetRSAPrivateKey() };
Signature xmlSignature = signedXml.Signature;
xmlSignature.SignedInfo.AddReference(reference);

KeyInfo keyInfo = new();
keyInfo.AddClause(new KeyInfoX509Data(cert));
xmlSignature.KeyInfo = keyInfo;

// Gera a assinatura
signedXml.ComputeSignature();

XmlElement signedXmlWithSchPrefix = signedXml.GetXml();
signedXmlWithSchPrefix.SetAttribute("xmlns:sch", customNamespace); //

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post