ASSINATURA XML

PROSOFTSISTEMAS 18/04/2025 10:52:20
#504914
Alterado em 18/04/2025 12:28:13 Pessoal... tenho o seguinte código escrito em VB que uso para assinatura de NFS-e
(A variável DOC é um XmlDocument que contem o XML a ser assinado)
(A variável cert contem o certificado digital a ser usado na assinatuara)

Dim SignedXml As SignedXml = New SignedXml(Doc)
SignedXml.SigningKey = Cert.PrivateKey 'Certificado digital)
Dim Reference As Reference = New Reference
Reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#sha1"
Dim XUri As XmlAttributeCollection = Doc.GetElementsByTagName(refUri).Item(0).Attributes
For Each xAtribute As XmlAttribute In XUri
If xAtribute.Name = "Id" Then Reference.Uri = "#" + xAtribute.InnerText
Next
Dim Env As XmlDsigEnvelopedSignatureTransform = New XmlDsigEnvelopedSignatureTransform
Reference.AddTransform(Env)
Dim C14 As XmlDsigC14NTransform = New XmlDsigC14NTransform
Reference.AddTransform(C14)
SignedXml.AddReference(Reference)

Dim KeyInfo As KeyInfo = New KeyInfo
KeyInfo.AddClause(New KeyInfoX509Data(Cert))
SignedXml.KeyInfo = KeyInfo
SignedXml.ComputeSignature()
Dim XmlDigitalsignature As XmlElement = SignedXml.GetXml()
Doc.DocumentElement.AppendChild(Doc.ImportNode(XmlDigitalsignature, True))

Ela funciona bem direitinho, só que preciso que a assinatura apresente esse prefixo ds:
Alguém sabe me auxiliar o que mudo no código da assinatura para que esse prefixo seja assinatura

ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#teste">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>vMrgmQDkB7xQEgRIfXnrKMM6uZI=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>

PROSOFTSISTEMAS 18/04/2025 16:51:30
#504919
Qualquer sugestão será bem vinda. Estou correndo contra o tempo
FABRICIOWEB 21/04/2025 09:00:00
#504920
Resposta escolhida
Para adicionar o prefixo ds: na assinatura XML (em especial nos elementos como <ds:Signature> e todos os filhos), você precisa fazer um pequeno ajuste após gerar a assinatura, pois por padrão o SignedXml do .NET não adiciona prefixos ao namespace de assinatura — ele simplesmente usa o namespace padrão (sem prefixo).

Você pode inserir o prefixo ds: manualmente nos elementos da assinatura XML, logo depois de chamar SignedXml.GetXml().

Substitua esta linha:

Dim XmlDigitalsignature As XmlElement = SignedXml.GetXml()

por

Dim XmlDigitalsignature As XmlElement = SignedXml.GetXml()


Adiciona o prefixo "ds" e o namespace em todos os elementos da assinatura

Dim nsmgr As New XmlNamespaceManager(Doc.NameTable)
nsmgr.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl)

AddPrefixToSignature(XmlDigitalsignature, "ds")


E adicione este método auxiliar para aplicar o prefixo ds: a todos os elementos da assinatura

Private Sub AddPrefixToSignature(node As XmlNode, prefix As String)
If node.NodeType = XmlNodeType.Element Then
node.Prefix = prefix
End If

For Each child As XmlNode In node.ChildNodes
AddPrefixToSignature(child, prefix)
Next
End Sub

O XML gerado ficará assim

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="..."/>
...
</ds:SignedInfo>
...
</ds:Signature>
Tópico encerrado , respostas não são mais permitidas