quinta-feira, 16 de junho de 2016

Assinar XML com certificado Digital



Forum.pcsoft.fr/fr-FR/pcsoft.br.windev/1253-assinar-xml-com-certificado-digital/read.awp



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










Nenhum comentário:

Postar um comentário

Teste

Teste
teste