PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 25 → Assinar XML com certificado Digital
Assinar XML com certificado Digital
Débuté par TOM SILVA / RMT SYST, 30 mai 2016 21:18 - 3 réponses
Membre enregistré
7 messages
Popularité : +2 (2 votes)
Posté le 30 mai 2016 - 21:18
Aqui deixo para voces usando como assinar um xml usando certificado digital. em base ao exemplo do Vilani.

Agradecimentos a @JorgeMatos - PT e @mpDani - MX

Codigo do botao

sXmlstring , sMlfirmado is string
sXmlstring = fLoadText(fExeDir()+"\arquivo.xml",foUnicode)
sMlfirmado = AssinarXML(sXmlstring)

fSaveText(fExeDir()+"\arquivoAssinado.xml",sMlfirmado)



Procedure

Procedure AssinarXML(xmlString is string)
s_IssuerName, s_SerialNumber are strings

X509Cert is X509Certificate2("certificado.pfx","SenhaCertificado")

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

Doc.LoadXml(xmlString)

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

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

//Criar um Referenceobjeto que descreve o que assinar.Para assinar o documento inteiro, defina aUripropriedade"".
Reference is Reference();
Reference.set_Uri("");
//Reference.set_Uri("Soap Body");


// 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);

// 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))

// Obter IssuerName e SerialNumber
kdata is KeyInfoX509Data(X509Cert)
s_IssuerName = X509Cert.IssuerName.ToString()
s_SerialNumber = X509Cert.SerialNumber
kdata.AddIssuerSerial(s_IssuerName, s_SerialNumber)
VrkeyInfo.AddClause(kdata)

// 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))


//devolve o documento assinado
RESULT Doc.get_InnerXml()
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 30 mai 2016 - 22:34
Parabéns Tom e Vilani!

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 31 mai 2016 - 04:28
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 NFe PHP, 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 iniciar uma série de posts sobre esse assunto (NFe), a ideia é 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


:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 12 février 2018 - 16:21
Links Complementares

https://m.youtube.com/watch…

http://windevdesenvolvimento.blogspot.com/2016/06/curso-windev-certificado-007-assinatura.html…

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

http://www.windevbrasil.com.br/index.php…

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/