Assinatura digital dos arquivos XML do eSocial

Schema padrão de assinatura (arquivo xmldsig-core-schema.xsd)

Nas versões iniciais do eSocial era requerido o uso do algorítmo SHA-1 para a assinatura digital dos arquivos XML dos eventos, mas depois o requerimento passou a ser o algorítmo SHA-256.

Entretanto, o arquivo xmldsig-core-schema.xsd, que contém as definições do esquema da assinatura digital usada nos XMLs de eventos do eSocial, foi disponibilizado pela última vez no pacote de esquemas da versão 2.0, quando ainda fazia referência ao SHA-1, e não foi mais atualizado.

Fizemos então essa alteração manualmente no arquivo, trocando em dois lugares a configuração do antigo SHA-1 para o novo SHA-256, como mostrado logo abaixo:

No elemento SignatureMethod, o antigo algorítmo SHA-1:

<element name="SignatureMethod">
   <complexType>
      <attribute name="Algorithm" type="anyURI" use="required" fixed="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
   </complexType>
</element>
      

trocado para o algorítmo SHA-256 requerido:

<element name="SignatureMethod">
   <complexType>
      <attribute name="Algorithm" type="anyURI" use="required" fixed="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
   </complexType>
</element>
      


No elemento DigestMethod, o antigo algorítmo SHA-1:

<element name="DigestMethod">
   <complexType>
      <attribute name="Algorithm" type="anyURI" use="required" fixed="http://www.w3.org/2000/09/xmldsig#sha1"/>
   </complexType>
</element>
      

trocado para o algorítmo SHA-256 requerido:

<element name="DigestMethod">
   <complexType>
      <attribute name="Algorithm" type="anyURI" use="required" fixed="http://www.w3.org/2001/04/xmlenc#sha256"/>
   </complexType>
</element>
      


Além disso, ao validar um XML de evento do eSocial, usando seu respectivo arquivo XSD (XML Schema Definition), o validador indica um erro, porque segundo a definição no arquivo xmldsig-core-schema.xsd disponibilizado pelo governo, o atributo URI do elemento Reference, é obrigatório.

Entretanto, consultamos o arquivo xmldsig-core-schema.xsd disponibilizado pelo W3C (World Wide Web Consortium, é a principal organização de padronização da World Wide Web), e lá esse atributo URI é opcional (link para o arquivo no W3C).

Por isso, fizemos também essa alteração manualmente. Depois disso a validação do XML passa a funcionar.

No elemento Reference, o atributo URI era obrigatório:

<attribute name="URI" use="required">
   <simpleType>
      <restriction base="anyURI">
         <minLength value="2"/>
      </restriction>
   </simpleType>
</attribute>
      

e trocamos para opcional:

<attribute name="URI" type="anyURI" use="optional"/>
      


Segue o link para o arquivo final, com todas essas correções mencionadas:

Atualização: Em 10/07/2017 o governo disponibilizou a versão 1.3.2 do Pacote de Comunicação (notícia), que finalmente inclui uma versão atualizada do schema padrão de assinatura (arquivo xmldsig-core-schema.xsd), que por um acaso é exatamente igual ao arquivo disponibilizado no site do W3C (link).


Assinando o XML (em C#)

A fonte que usamos para escrever o código que assina o XML, que estava usando o algoritmo SHA-1 no começo, porque era esse o requerido, foi o exemplo que está nessa página, a função SignXmlFile:
https://msdn.microsoft.com/en-us/library/ms148731(v=vs.110).aspx

E a fonte que usamos para atualizar o código, para gerar a assinatura usando o algoritmo SHA-256, foi essa página:
Using SHA256 with the SignedXml Class

Esse segundo exemplo usa a transformação Exclusive C14N, mas o eSocial requer a transformação C14N, então é necessário alterar a classe XmlDsigExcC14NTransform para XmlDsigC14NTransform.

E, como a chave usada para a assinatura virá de um certificado digital previamente carregado, é possível substituir a linha em que a propriedade SignedXml.SigningKey é informada por essa linha (onde o objeto certificate é do tipo X509Certificate2):

         signedXml.SigningKey = certificate.GetRSAPrivateKey();
      

(Observação: O método GetRSAPrivateKey() só está disponível a partir do .NET Framework 4.6)


Atenção: No Manual de Orientação do Desenvolvedor, página 14, item 4.1.1 Declaração namespace, está definido que o elemento raiz do XML deve conter apenas o namespace referente ao eSocial, no atributo xmlns, entretanto, normalmente os arquivos XML gerados automaticamente incluem também os atributos xmlns:xsi e xmlns:xsd. Em testes constatamos que ao manter esses dois atributos o retorno do processamento do evento dá um erro com a seguinte descrição: "Assinatura do evento inválida. Ações Sugeridas: Verificar se houve alteração do evento após a assinatura. Verificar a validade da assinatura.". Portanto, lembre-se de remover esses atributos ao gerar os XMLs para o eSocial.



Autor: Pedro Gaspar (QuartaRH)
Última atualização: 21/07/2017