Mostrando postagens com marcador Vilani. Mostrar todas as postagens
Mostrando postagens com marcador Vilani. Mostrar todas as postagens

segunda-feira, 22 de fevereiro de 2016

SÉRIE NFe - Assinar NFe com Certificado A1

http://leonardo-vilani.blogspot.com.br/2016/02/serie-nfe-assinar-nfe-com-certificado-a1.html

 


SÉRIE NFe - Assinar NFe com Certificado A1


NFe, XML, Certificado digital, Assinatura...... Sei que o assunto não é novo, mas para mim é um novo desafio, hoje contamos com muitas soluções prontas que nos auxiliam com as tarefas da NFe desde a geração do XML, assinatura digital até a impressão da DANFE, em nosso caso optamos por uma versão grátis o escolhido foi o NFePHP, inclusive quero deixar os meus agradecimentos ao Roberto L. Machado e aos demais colaboradores desta excelente solução, fiquei impressionado com a qualidade do material, o projeto é super organizado e documentado mesmo eu não tendo muita experiência com PHP não tive dificuldades para integrar ao meu projeto.
Bom vamos ao que interessa, hoje pela manhã tive que ficar de molho uma hora e meia esperando minha consulta no dentista, para não ficar entediado resolvi dar uma olhada no post anterior para ver o que faltava para concluir nossa assinatura com o certificado digital, e depois de uns ajustes aqui e outros ali, pimba!!! XML Assinado com sucesso rsrsr.

Pretendemos inciar uma série de posts sobre esse assunto (NFe), a idéia é podermos comparar as diversas formas de solucionar esse problema, seja usando Wlanguage, ou soluções de terceiros como NFePHP, OpenNFe, ACBR, vamos iniciar com esse tutorial complementar do post anterior, onde vamos fazer a assinatura do XML com o certificado digital A1, quero deixar aberto o espaço a quem quiser colaborar com qualquer material sobre o assunto, bom vamos colocar a mão na massa agora.



Código da Procedure:

PROCEDURE ASSINA_NFe(xmlString, RefUri, sChNfe, x509Cert)

// Cria um novo XML.
Doc is System.Xml.XmlDocument;

Doc.LoadXml(xmlString)

// Verifica se a tag a ser assinada existe é única
qtdeRefUri is int = Doc.GetElementsByTagName(RefUri).Count

IF (qtdeRefUri = 0)
// a URI indicada não existe

ELSE

IF (qtdeRefUri > 1)
//existe mais de uma URI indicada

ELSE

// cria um objeto xml assinado
VrSignedXml is SignedXml(Doc) //= SignedXml(doc);

// adiciona a chave do certificado
VrSignedXml.SigningKey = x509Cert.PrivateKey

// Cria a referencia para assinatura
Reference is Reference //= new Reference();
Reference.Uri = "#" + sChNfe

// adiciona um XmlDsigEnvelopedSignatureTransform para a assinatura
Env is XmlDsigEnvelopedSignatureTransform 
Reference.AddTransform(Env)

c14 is XmlDsigC14NTransform 
Reference.AddTransform(c14)

// adiciona a referencia no xml assinado
VrSignedXml.AddReference(Reference)

// Cria a chave
VrkeyInfo is KeyInfo 

// carrega o certificado em um keyinfox509 e adiciona ao keyinfo
VrkeyInfo.AddClause(new KeyInfoX509Data(x509Cert))

// adiciona o keyinfo ao xml assinado
VrSignedXml.keyInfo = VrkeyInfo
VrSignedXml.ComputeSignature()

// busca a representacao XML da assinatura e salva no XML
xmlDigitalSignature is System.Xml.XmlElement dynamic = VrSignedXml.GetXml()

// adiciona a assinatura no documento
Doc.DocumentElement.AppendChild(Doc.ImportNode(xmlDigitalSignature, True))

//salva o documento assinado
RESULT Doc.get_InnerXml()
END
END








quinta-feira, 18 de fevereiro de 2016

Como assinar documento XML com assinaturas digitais em Windev - leonardo vilani



http://leonardo-vilani.blogspot.com.br/2016/02/como-assinar-documento-xml-com.html



Video do Leonardo Villani sobre Xml



Como assinar documento XML com assinaturas digitais em Windev

Olá pessoal, recentemente inciamos um projeto para emissão de NFe Web, como gostamos de ganhar tempo sempre que possível procuramos reaproveitar outros projetos, ou até mesmo usar recursos FREE disponíveis na internet, para esse caso optamos por usar o NFePHP, com ele conseguimos economizar tempo com várias rotinas como Status do Serviço, Validar XML, Assinar XML, Enviar XML, Enviar Lote, Validar NFe..... sabemos que no Webdev temos rotinas que facilitam trabalhos como consumir WS, criar XML... mas apesar de ter as funções  para manipulação e assinaturas de arquivos com certificado digital não encontramos uma forma de assinar um XML diretamente com elas, apesar de ter pronto esse recurso para web com PHP,  resolvi investir em uma forma de conseguir esse resultado sem uso de controles ou componentes de terceiros, assim teria certeza de que é possível desenvolver uma solução 100% independente,. Navegando pelo site da PCSoft observei que saiu na LST 103 um exemplo de assinatura em XML usando .NET então a lampada acendeu e resolvi dar uma pesquisada sobre isso, acabei descobrindo que posso fazer muito mais do que imaginava com esse recurso, e resolvi postar esse pequeno exemplo mas que pode ampliar e muito nossas possibilidades dentro do windev/webdev. Bom vamos la:


1) Crie um projeto no Windev e adicione os Assemblies .NET




2) Crie um form com um botão, no código do botão inclua o seguinte código:


//1 - Criar um CspParameters do objeto e especifique o nome do contêiner de chave.
cspParams is CspParameters();
cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

//2 - Gerar uma chave assimétrica usando oRSACryptoServiceProviderclasse.A chave é salvo automaticamente para o 
// contêiner de chave quando você passa oCspParametersao construtor daRSACryptoServiceProviderclasse.Essa chave será usada para assinar o documento XML.
RsaKey is RSACryptoServiceProvider(cspParams);

//3 - Criar umXmlDocumentobjeto carregando um arquivo XML do disco.OXmlDocumentobjeto contém o elemento XML para criptografar.
XmlDoc is System.Xml.XmlDocument();
XmlDoc.PreserveWhitespace = True;
XmlDoc.Load("test.xml");

//4 - Criar um novoSignedXmlobject e passar oXmlDocumentobjeto nele.
SignedXml is SignedXml(XmlDoc);

//5 - Adicionar a chave de assinatura RSA para oSignedXmlobjeto.
SignedXml.SigningKey = RsaKey;

//6 - Criar umReferenceobjeto que descreve o que assinar.Para assinar o documento inteiro, defina aUripropriedade"".
reference is Reference();
reference.set_Uri("");

//7 - Adicione umXmlDsigEnvelopedSignatureTransformdo objeto para oReferenceobjeto.Uma transformação permite que o 
// verificador representar os dados XML da maneira idênticas que o signatário usado.Dados XML podem ser representados 
// de diversas maneiras, essa etapa é vital para verificação.
Env is XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(Env);

//8 - Adicionar oReferencedo objeto para oSignedXmlobjeto.
SignedXml.AddReference(reference);

//9 - Compute a assinatura ao chamar oComputeSignaturemétodo.
SignedXml.ComputeSignature();

//10 - Recuperar a representação XML da assinatura (um <Signature> elemento) e salvá-lo em um novoXmlElementobjeto.
XmlDoc.DocumentElement.AppendChild(XmlDoc.ImportNode(SignedXml.GetXml(), True));

//11 - Acrescente o elemento para oXmlDocumentobjeto.
XmlDoc.Save("test_ass.xml");


Pronto basta incluir um XML qualquer na pasta EXE do projeto e renomeá-lo para TEST.XML, ao clicar no botão será criado outro arquivo com nome de TEST_ASS.XML

Espero que ajude a vocês esclarecerem dúvidas como a minha e ampliem seus horizontes assim como ocorreu comigo, se observarem o código é praticamente um C# puro. Devemos disponibilizar nos próximos dias um exemplo de assinatura usando o certificado digital A1 para ser utilizado na NFe.






Teste

Teste
teste