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