Modos de inclusão
O processo de assinatura de um documento XML produz um elemento <Signature>
contendo as informações daquela
assinatura. Este elemento é incluído no XML seguindo o padrão descrito na tabela abaixo. Também é possível
determinar um local de inclusão customizado, como exemplifica a seção
Definindo local para inclusão do elemento de assinatura.
Padrão de inclusão do nó de assinatura
Assinador | Padrão | Padrão sem um documento XML passado |
---|---|---|
FullXmlSigner | Filho do elemento raiz | (Não se aplica) |
XmlElementSigner | Irmão do elemento assinado | (Não se aplica) |
OnlineResourceXmlSigner | Filho do elemento raiz | Elemento raiz |
DetachedResourceXmlSigner | Filho do elemento raiz | Elemento raiz |
Note
Nos assinadores FullXmlSigner e XmlElementSigner é obrigatório passar um documento XML, portanto não se aplica a coluna Padrão sem um documento XML passado
Caso se queira definir um local customizado para a inclusão do elemento de assinatura, verifique a seção seguinte.
Definindo local para inclusão do elemento de assinatura
No PKI SDK, é possível customizar o local de inclusão do elemento de assinatura através do método SetSignatureElementLocation(String, NamespaceManager, XmlInsertionOptions) nos assinadores.
Como exemplo, iremos fazer uma assinatura do documento XML inteiro abaixo:
<invoice xmlns="http://www.lacunasoftware.com/sample">
<issuer>
<name>Lacuna Software Ltda EPP</name>
<fiscalCode>20658903000171</fiscalCode>
</issuer>
<customer>
<name>Banco do Brasil SA</name>
<fiscalCode>00000000000191</fiscalCode>
</customer>
<items>
<item>
<productCode>10201</productCode>
<description>Philips screws</description>
<quantity>100</quantity>
</item>
</items>
<signaturePlaceholder>
<!-- We want the signature to be inserted here -->
</signaturePlaceholder>
</invoice>
Queremos, então, assinar o documento acima e incluir o elemento de assinatura dentro do elemento <signaturePlaceholder>
.
O código abaixo demonstra como fazê-lo.
// Create a namespace manager with the necessary namespaces to
// get to the target element for the signature insertion
var nsm = new NamespaceManager();
nsm.AddNamespace("ls", "http://www.lacunasoftware.com/sample");
string xpath = "//ls:signaturePlaceholder"; // XPath to the target element
var signer = new FullXmlSigner();
signer.SetXml(lacunaInvoiceXmlBytes); // Set the XML document bytes
signer.SetPolicy(policy); // Set the signature policy
signer.SetSigningCertificate(cert); // Set the certificate with key
// Set the signature element location
signer.SetSignatureElementLocation(xpath, nsm, XmlInsertionOptions.AppendChild);
signer.ComputeSignature();
var signedXml = signer.GetSignedXml(); // Return signed XML
O resultado do XML assinado terá o elemento de assinatura inserido como filho do elemento <signaturePlaceholder>
.
<invoice xmlns="http://www.lacunasoftware.com/sample">
...
<signaturePlaceholder>
<!-- We want the signature to be inserted here -->
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-fce02462-f2bd-4b7f-8def-f9c23b6672a2">
...
</Signature>
</signaturePlaceholder>
</invoice>
Note
Em relação ao parâmetro string xpath
do método
SetSignatureElementLocation(String, NamespaceManager, XmlInsertionOptions)
no assinador XmlElementSigner, o xpath é executado a partir do elemento escolhido para assinatura,
enquanto nos outros assinadores é executado a partir do elemento raiz do XML.