|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
NewCvf Novato
Registrado: Quarta-Feira, 15 de Mai de 2013 Mensagens: 41
|
Enviada: Sex Jul 18, 2014 3:03 pm Assunto: Assinar XML varias vezes |
|
|
Alguém sabe como assina o xml varias vezes em locais diferente?
hoje estou utilizando essa rotina:(abaixo), mas ela só assina uma unica vez, e sempre no mesmo lugar ou seja ele procura a tag "Signature" so que eu tenho varias tag Signature no XML, e preciso assinalas todas,
Código: |
function assinar(var AXMLEntrada,ARetorno: String): Boolean;
var
bResult : Boolean;
xmldoc : IXMLDOMDocument3;
xmldsig : IXMLDigitalSignature;
dsigKey : IXMLDSigKey;
signedKey : IXMLDSigKey;
PrivateKey : IPrivateKey;
CertStore : IStore3;
CertStoreMem : IStore3;
Certs : ICertificates2;
Cert : ICertificate2;
iFor : Integer;
begin
try
xmldoc := CoDOMDocument50.Create;
xmldoc.async := False;
xmldoc.validateOnParse := False;
xmldoc.preserveWhiteSpace := True;
xmldsig := CoMXDigitalSignature50.Create;
xmldoc.loadXML(AXMLEntrada);
xmldoc.setProperty('SelectionNamespaces', DSIGNS);
xmldsig.signature := xmldoc.selectSingleNode('.//ds:Signature');
CertStore := CoStore.Create;
CertStore.Open(CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
CertStoreMem := CoStore.Create;
CertStoreMem.Open(CAPICOM_MEMORY_STORE, 'Memoria', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
Certs := CertStore.Certificates as ICertificates2;
for iFor := 1 to Certs.Count do begin
Cert := IInterface(Certs.Item[iFor]) as ICertificate2;
if ( Cert.SerialNumber = FNroCertificado ) then begin
OleCheck(IDispatch(Certs[iFor].PrivateKey).QueryInterface(IPrivateKey,PrivateKey));
CertStoreMem.Add(Cert);
end;
end;
xmldsig.store := (CertStoreMem);
dsigKey := xmldsig.createKeyFromCSP(PrivateKey.ProviderType, PrivateKey.ProviderName, PrivateKey.ContainerName, 0);
signedKey := xmldsig.sign(dsigKey, $00000002);
AXMLEntrada:= xmldoc.xml;
bResult := True;
ARetorno:= 'Documento XML assinado com sucesso.';
except on E : Exception do
begin
bResult := False;
ARetorno:= 'Assinar: '+E.Message;
end;
end;
if ( not bResult ) then begin
if ( Pos('A Propriedade ou o objeto não foi encontrado',ARetorno)>0 ) then begin
ARetorno:= ARetorno+#$D#$A+'Verifique se o certificado digital está instalado corretamente para o usuário atual do Windows.'
end;
end;
Result := bResult;
end;
|
|
|
Voltar ao Topo |
|
|
flexsistemas Aprendiz
Registrado: Terça-Feira, 29 de Outubro de 2013 Mensagens: 121 Localização: Caxias do Sul
|
Enviada: Ter Ago 18, 2015 8:48 am Assunto: |
|
|
Olá,
gostaria de saber se você pode me ajudar. Estou com um problema ao assinar documentos, no meu caso, arquivos XML. Estou assinando de uma forma muito parecida com a sua porém ele está retornando a seguinte mensagem de erro:
Poderia me dar alguma idéia do problema?
Obrigado. |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|