Files
cybercore-signer/docs/xml-xmldsig.md

6.8 KiB

Assinaturas XML no Padrão XAdES e ICP-Brasil

Este documento descreve a especificação, conformidade e o funcionamento da assinatura digital de arquivos XML no padrão avançado XAdES (XML Advanced Electronic Signatures - ETSI TS 101 903 e ICP-Brasil DOC-ICP-15.03) e W3C XMLDSig no CyberCore Signer.


1. Visão Geral

O CyberCore Signer fornece suporte nativo a assinaturas digitais XML utilizando a engine padronizada e segura da plataforma Java (javax.xml.crypto.dsig), garantindo conformidade com o padrão XAdES-BES adotado pelo ITI (Instituto Nacional de Tecnologia da Informação) na infraestrutura ICP-Brasil (perfil AD-RB).

1.1 Perfis Suportados

  • XAdES-BES (Padrão Recomendado / ICP-Brasil):
    • Conforme especificação técnica ETSI TS 101 903 e norma DOC-ICP-15.03.
    • Encapsula o elemento <ds:Object> contendo <xades:QualifyingProperties> e <xades:SignedProperties>.
    • Inclui propriedade qualificada de data/hora da assinatura (<xades:SigningTime>) em formato UTC ISO-8601.
    • Inclui vínculo criptográfico irrefutável do certificado do signatário (<xades:SigningCertificate>) contendo o digest SHA-256 do certificado DER e referências do emissor/serial (<xades:IssuerSerial>).
    • Protege as propriedades qualificadas através de uma <ds:Reference> em <ds:SignedInfo> com Type="http://uri.etsi.org/01903#SignedProperties".
  • XMLDSig Clássico (W3C Enveloped):
    • Mantido para compatibilidade com layouts estritos de notas fiscais eletrônicas legadas (ex: NF-e, CT-e, MDF-e SEFAZ).

1.2 Casos de Uso Suportados

  • Documento Inteiro Envelopado (URI=""): Contratos, despachos, declarações, laudos e relatórios em XML.
  • Assinatura de Elementos Específicos por ID:
    • NF-e (Nota Fiscal Eletrônica): Assinatura da tag <infNFe Id="NFe...">
    • CT-e (Conhecimento de Transporte Eletrônico): Assinatura da tag <infCte Id="CTe...">
    • MDF-e (Manifesto Eletrônico de Documentos Fiscais): Assinatura da tag <infMDFe Id="MDFe...">
    • eSocial / EFD-Reinf: Assinatura de eventos com tags <evt... Id="...">

2. Estrutura Criptográfica do XAdES-BES

<ds:Signature Id="sig-[UUID]" 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/2001/04/xmldsig-more#rsa-sha256"/>
    
    <!-- Referência 0: Dados de Negócio (Documento completo ou elemento específico) -->
    <ds:Reference URI="#[ElementoId]">
      <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/2001/04/xmlenc#sha256"/>
      <ds:DigestValue>[Digest do nó em Base64]</ds:DigestValue>
    </ds:Reference>

    <!-- Referência 1: Propriedades Qualificadas Assinadas XAdES -->
    <ds:Reference URI="#signed-props-[UUID]" Type="http://uri.etsi.org/01903#SignedProperties">
      <ds:Transforms>
        <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
      </ds:Transforms>
      <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
      <ds:DigestValue>[Digest das SignedProperties em Base64]</ds:DigestValue>
    </ds:Reference>
  </ds:SignedInfo>

  <ds:SignatureValue>[Assinatura RSA-SHA256 em Base64]</ds:SignatureValue>

  <ds:KeyInfo>
    <ds:X509Data>
      <ds:X509Certificate>[Certificado DER do signatário em Base64]</ds:X509Certificate>
    </ds:X509Data>
  </ds:KeyInfo>

  <ds:Object>
    <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#sig-[UUID]">
      <xades:SignedProperties Id="signed-props-[UUID]" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
        <xades:SignedSignatureProperties>
          <xades:SigningTime>2026-10-11T14:05:00Z</xades:SigningTime>
          <xades:SigningCertificate>
            <xades:Cert>
              <xades:CertDigest>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <ds:DigestValue>[SHA-256 do Certificado]</ds:DigestValue>
              </xades:CertDigest>
              <xades:IssuerSerial>
                <ds:X509IssuerName>[Emissor X.500]</ds:X509IssuerName>
                <ds:X509SerialNumber>[Número Serial]</ds:X509SerialNumber>
              </xades:IssuerSerial>
            </xades:Cert>
          </xades:SigningCertificate>
        </xades:SignedSignatureProperties>
      </xades:SignedProperties>
    </xades:QualifyingProperties>
  </ds:Object>
</ds:Signature>

3. Segurança e Mitigação contra Ataques XXE

O parser XML é configurado com blindagem estrita contra ataques XML External Entity (XXE) e expansões recursivas de entidades:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);

4. Validação Pós-Assinatura e Auditoria

O serviço XmlSigningService.validateXmlSignature(byte[] xmlBytes) e o SignatureValidationService realizam:

  1. Validação criptográfica de SignedInfo: Confere se o SignatureValue foi emitido pela chave pública correspondente.
  2. Validação de integridade dos dados de negócio: Confere o digest do conteúdo ou elemento assinado.
  3. Validação de integridade do XAdES: Confere o digest das propriedades qualificadas (SignedProperties), rejeitando qualquer adulteração no horário de assinatura (SigningTime) ou no certificado declarado.
  4. Inspeção de signatário e datação: Extração de nome, documento (CPF/CNPJ), autoridade certificadora emissora e datação auditável.

5. Integração Web e SDK (@cybercore/signer-sdk)

As aplicações web autorizadas podem assinar arquivos XML diretamente via protocolo CCSP/1 com o método signXmlDocument():

import { CyberCoreSigner } from '@cybercore/signer-sdk';

const signer = new CyberCoreSigner();

// Assinatura de documento XML ou evento fiscal
const result = await signer.signXmlDocument({
  certificateId: cert.id,
  xml: xmlString, // texto puro ou xml_base64
  profile: 'XADES_BES', // ou 'XMLDSIG'
  targetElementTag: 'infNFe', // opcional
  targetElementId: 'NFe35261012345678000199550010000001001234567890' // opcional
});

console.log('XML Assinado Retornado:', result.signed_xml);
console.log('Algoritmo Utilizado:', result.algorithm);