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));
}
Boa tarde, Vitor
Me fala seu email que te mando uma dica ….Abraço
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/
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/
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 🙂
É … eu também não consigo com o meu A3 … snif snif.
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
Vitor, vc já conseguiu configurar a ferramenta SoapUI com o certificado A3?