FórumCategoria: Fórum - Perguntas e RespostaseSocial – Assinatura Digital A3 (e-CPF) [C#]
Vitor Augusto Sugahara Ruiz perguntou há 8 anos

Olá, Pessoal!
 
Estou desenvolvendo a mensageria do eSocial utilizando C#, gerando as classes automaticamente baseadas nos XSD.
 
O procedimento está “ok” (até então não tínhamos como testar o envio dos eventos, certo?).
Eu estava gerando os XML dos eventos e para motivos de testes internos, eu estava assinando o XML com um certificado local, para passar na validação utilizando o XSD do evento.
Pois bem, agora que o ambiente de testes está no ar, eu gostaria de saber se alguém poderia ajudar na parte da assinatura A3, utilizando e-CPF.
Fiz a requisição de um, já instalei na máquina e testei pelo site do Serasa. Agora preciso saber como assinar nos padrões do eSocial, utilizando o algoritmo SHA256 e, neste caso, certificado A3, um e-CPF com leitora e cartão.
Segue código que atualmente utilizo para assinar:
public String AssinarArquivo(String nomeArquivo)
{
  try
  {
     // Cria um novo objeto CspParameters para especificar aonde está a chave.
     CspParameters cspParams = new CspParameters();
     cspParams.KeyContainerName = “XML_DSIG_RSA_KEY”; // Nome do conteiner
     // Cria uma nova chave assinadora e salva no conteiner.
     RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
     // Cria um novo documento XML.
     XmlDocument xmlDoc = new XmlDocument();
     // Carrega um arquivo XML no objetivo XML criado.
     xmlDoc.PreserveWhitespace = true;
     xmlDoc.Load(System.IO.Path.GetDirectoryName(Application.ExecutablePath) + @”\XML\” +                  nomeArquivo + “.xml”);
     // Assina o documento XML.
     SignXml(xmlDoc, rsaKey);
     retorno = “XML assinado!”;
     StringBuilder sb = new StringBuilder();
     XmlWriterSettings settings = new XmlWriterSettings
     {
       Indent = true,
       IndentChars = ” “,
       NewLineChars = “\r\n”,
       NewLineHandling = NewLineHandling.Replace
     };
     using (XmlWriter writer = XmlWriter.Create(sb, settings))
     {
       xmlDoc.Save(writer);
       //retorno += sb.ToString();
     }
     // Salva o documento. (Sobrepõe o XML que não estava assinado)
     xmlDoc.Save(System.IO.Path.GetDirectoryName(Application.ExecutablePath) + @”\XML\” +                  nomeArquivo + “.xml”);
  }
     catch (Exception ex)
     {
       retorno = ex.Message;
     }
     return retorno;
}
// Função que assina o arquivo XML.
// Este documento não pode ser verificado a não ser que o código verificador tenha a chave com a qual foi assinada
public static void SignXml(XmlDocument xmlDoc, RSA Key)
{
   // Verificando os parâmetros.
   if (xmlDoc == null)
   throw new ArgumentException(“xmlDoc”);
   if (Key == null)
   throw new ArgumentException(“Key”);
   // Criando um objeto SignedXml.
   SignedXml signedXml = new SignedXml(xmlDoc);
   // Adicionando a chave ao documento SignedXml.
   signedXml.SigningKey = Key;
   // Criando a referência que será ser assinada.
   Reference reference = new Reference();
   reference.Uri = “”;
   // Adicionando uma transformação envelopada à referência.
   XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
   reference.AddTransform(env);
   // Adicionando a referência ao objeto SignedXml.
   signedXml.AddReference(reference);
   // Computando a assinatura.
   signedXml.ComputeSignature();
   // Obtém a representação da assinatura em XML e salva em um objeto XML.
   XmlElement xmlDigitalSignature = signedXml.GetXml();
   // Pendura o elemento no documento XML.
   xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
  }

Vitor Augusto Sugahara Ruiz respondeu há 8 anos

Pois é, Lucia.
Criei um tópico sobre isso para ver se alguém que conseguiu dá uma força lá.
Vamos torcer para alguma ajuda 🙂

Lucia Helena Bovo Calzado respondeu há 8 anos

É … eu também não consigo com o meu A3 … snif snif.

Vitor Augusto Sugahara Ruiz respondeu há 8 anos

Oi Lucia, não consegui configurar justamente por ser certificado do tipo A3. Não é possível marcar a chave privada como exportável.
Mas este link aqui auxilia na configuração, se quiser tentar:
http://geekswithblogs.net/gvdmaaden/archive/2011/02/24/how-to-configure-soapui-with-client-certificate-authentication.aspx

Lucia Helena Bovo Calzado respondeu há 8 anos

Vitor, vc já conseguiu configurar a ferramenta SoapUI com o certificado A3?

1 Respostas
Lucia Helena Bovo Calzado respondeu há 8 anos

Boa tarde, Vitor
Me fala seu email que te mando uma dica ….Abraço

Vitor Augusto Sugahara Ruiz respondeu há 8 anos

Oi, Lucia. Boa Tarde.
Eu já consegui resolver. Tinha até apagado o tópico mas estranhamente está aqui ainda.
De qualquer forma, muito obrigado!

Caso alguém tenha chegado até aqui com a mesma dúvida, este link me ajudou:
https://blogs.msdn.microsoft.com/winsdk/2015/11/14/using-sha256-with-the-signedxml-class/

Vitor Augusto Sugahara Ruiz respondeu há 8 anos

Oi, Lucia. Boa Tarde.
Eu já consegui resolver. Tinha até apagado o tópico mas estranhamente está aqui ainda.
De qualquer forma, muito obrigado!

Caso alguém tenha chegado até aqui com a mesma dúvida, este link me ajudou:
https://blogs.msdn.microsoft.com/winsdk/2015/11/14/using-sha256-with-the-signedxml-class/