Erro ao Assinar xml
Boa noite a todos baixei os tutoriais do minicurso de firemonkey e nfe 2.0 e estou travado na parte da assinatura da sempre o erro de parâmetro incorreto e para nessa linha
AssinaturaXML := CoMXDigitalSignature50.Create;
AssinaturaXML.signature:= DocumentDOM.selectSingleNode('.//ds:Signature');
MemoriaStore := CoStore.Create;
MemoriaStore.Open(CAPICOM_MEMORY_STORE, 'Mem', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
MemoriaStore.Add(certificado); =====================> sempre para nesta linha e da a mensagem de erro alguém pode me ajudar
OleCheck(IDispatch(certificado.PrivateKey).QueryInterface(iprivatekey, ChaverPrivada));
AssinaturaXML.store := MemoriaStore;
XmlAssina := AssinaturaXML.createKeyFromCSP(ChaverPrivada.ProviderType, ChaverPrivada.ProviderName, ChaverPrivada.ContainerName, 0);
XmlAssinada := AssinaturaXML.sign(XmlAssina, $00000002);
NfeAssinada := DocumentDOM.xml;
NfeAssinada := StringReplace(NfeAssinada, chr(13), '' ,[rfReplaceall]);
NfeAssinada := StringReplace(NfeAssinada, chr(10), '' ,[rfReplaceall]);
PosSignature := pos('<SignatureValue>', NfeAssinada) +16;
NfeAssinada := copy(NfeAssinada, 1, PosSignature) + StringReplace(copy(NfeAssinada, posSignature, length(NfeAssinada)),'' ,'', [rfReplaceall]) ;
StrStream := TStringStream.Create();
StrStream.WriteString(NfeAssinada);
StrStream.WriteString(NfeAssinada);
// StrStream.SaveToFile('C:\exemplos\NFE\xml\NfeAssinadas\'+Copy(UriNfe, 4, 44)+ '-nfe.xml');
StrStream.SaveToFile('C:\exemplos\NFE\xml\'+Copy(UriNfe, 4, 44)+ '-nfe.xml');
result := true;
desde já grato pela ajuda
AssinaturaXML := CoMXDigitalSignature50.Create;
AssinaturaXML.signature:= DocumentDOM.selectSingleNode('.//ds:Signature');
MemoriaStore := CoStore.Create;
MemoriaStore.Open(CAPICOM_MEMORY_STORE, 'Mem', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
MemoriaStore.Add(certificado); =====================> sempre para nesta linha e da a mensagem de erro alguém pode me ajudar
OleCheck(IDispatch(certificado.PrivateKey).QueryInterface(iprivatekey, ChaverPrivada));
AssinaturaXML.store := MemoriaStore;
XmlAssina := AssinaturaXML.createKeyFromCSP(ChaverPrivada.ProviderType, ChaverPrivada.ProviderName, ChaverPrivada.ContainerName, 0);
XmlAssinada := AssinaturaXML.sign(XmlAssina, $00000002);
NfeAssinada := DocumentDOM.xml;
NfeAssinada := StringReplace(NfeAssinada, chr(13), '' ,[rfReplaceall]);
NfeAssinada := StringReplace(NfeAssinada, chr(10), '' ,[rfReplaceall]);
PosSignature := pos('<SignatureValue>', NfeAssinada) +16;
NfeAssinada := copy(NfeAssinada, 1, PosSignature) + StringReplace(copy(NfeAssinada, posSignature, length(NfeAssinada)),'' ,'', [rfReplaceall]) ;
StrStream := TStringStream.Create();
StrStream.WriteString(NfeAssinada);
StrStream.WriteString(NfeAssinada);
// StrStream.SaveToFile('C:\exemplos\NFE\xml\NfeAssinadas\'+Copy(UriNfe, 4, 44)+ '-nfe.xml');
StrStream.SaveToFile('C:\exemplos\NFE\xml\'+Copy(UriNfe, 4, 44)+ '-nfe.xml');
result := true;
desde já grato pela ajuda
Reijanio Ribeiro
Curtidas 0
Respostas
Victor Zanella
29/04/2014
tem como postar o projeto ?
GOSTEI 0
Reijanio Ribeiro
29/04/2014
tem sim
código do botão conforme tutoriais
procedure TF_Nfe.btnassinarClick(Sender: TObject);
var
Busca: TSearchRec;
Arquivos: TStringList;
i: Integer;
ArquivoParaAssinar: TextFile;
ArquivoTemp: AnsiString;
Assinou: Boolean;
Diretorio, retorno: String;
begin
Diretorio := 'C:\exemplos\NFE\xml\';
if not Assigned(CertificadoAtual) then
selecionacertificado;
Arquivos := TStringList.Create;
// ShowMessage(CertificadoAtual.SerialNumber);
try
i := FindFirst(Diretorio + '*.xml', 0, Busca);
while i = 0 do
begin
Arquivos.Add(Busca.Name);
i := FindNext(Busca);
end;
for i := Arquivos.Count downto 1 do
begin
AssignFile(ArquivoParaAssinar, Diretorio + Arquivos[i - 1]);
Reset(ArquivoParaAssinar);
Readln(ArquivoParaAssinar, ArquivoTemp);
Assinou := AssinaXmlNfe(CertificadoAtual, ArquivoTemp, 'NFe');
CloseFile(ArquivoParaAssinar);
if Assinou then
ShowMessage('Assinou!')
else
ShowMessage('Não Assinou');
end;
except
on e: Exception do
ShowMessage('Houve um erro: '+ e.Message);
end;
end;
rotina que gera a assinatura do xml como estou apenas estudando esta nova tecnologia não fiz nenhuma alteração ainda
function TF_Nfe.AssinaXmlNfe(certificado: ICertificate2;
ArquivoXml,tipo: AnsiString): Boolean;
var
PosId, PosSignature, i : Integer;
{Tipo,}UriNfe: string;
NfeAssinada: AnsiString;
DocumentDOM : IXMLDOMDocument3;
AssinaturaXML: IXMLDigitalSignature;
XmlAssina, XmlAssinada: IXMLDSigKey;
MemoriaStore: istore3;
ChaverPrivada: IPrivateKey;
StrStream : TStringStream;
begin
Tipo := 'nfe';
try
if pos('<inf' + Tipo, arquivoXML)>0 then
begin
PosId := Pos('id=', ArquivoXml);
UriNfe := copy(ArquivoXml, PosId + 4, 47);
ArquivoXml := Copy(ArquivoXml, 1, pos('</'+ Tipo +'>', ArquivoXml)-1);
ArquivoXml := ArquivoXml + '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">'+
'<SignedInfo><CanonicalizationMethod Algorithm='+
'"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>'+
'<SignatureMethod Algorithm='+
'"http://www.w3.org/2000/09/xmldsig#rsa-sha1" />';
ArquivoXML := ArquivoXML + '<Reference URI="#'+ UriNFe +'"><Transforms><Transform Algorithm='+
'"http://www.w3.org/2000/09/xmldsig#enveloped-signature" />'+
'<Transform Algorithm='+
'"http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /></Transforms>'+
'<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />';
ArquivoXML := ArquivoXML + '<DigestValue></DigestValue></Reference></SignedInfo>'+
'<SignatureValue></SignatureValue><KeyInfo></KeyInfo></Signature>';
ArquivoXML := ArquivoXML + '</'+ Tipo +'>';
end;
DocumentDOM := CoDOMDocument50.Create;
with DocumentDOM do
begin
async := false;
validateOnParse := False;
preserveWhiteSpace :=true;
loadXML(ArquivoXml);
// setProperty('selectionNamespaces', 'xmlns:ds="http://www.w3.org/2000/09/xmldsig#"');
setProperty('SelectionNamespaces', 'xmlns:ds="http://www.w3.org/2000/09/xmldsig#"');
end;
AssinaturaXML := CoMXDigitalSignature50.Create;
AssinaturaXML.signature:= DocumentDOM.selectSingleNode('.//ds:Signature');
MemoriaStore := CoStore.Create;
MemoriaStore.Open(CAPICOM_MEMORY_STORE, 'Mem', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
MemoriaStore.Add(certificado);
OleCheck(IDispatch(certificado.PrivateKey).QueryInterface(iprivatekey, ChaverPrivada));
AssinaturaXML.store := MemoriaStore;
XmlAssina := AssinaturaXML.createKeyFromCSP(ChaverPrivada.ProviderType, ChaverPrivada.ProviderName, ChaverPrivada.ContainerName, 0);
XmlAssinada := AssinaturaXML.sign(XmlAssina, $00000002);
NfeAssinada := DocumentDOM.xml;
NfeAssinada := StringReplace(NfeAssinada, chr(13), '' ,[rfReplaceall]);
NfeAssinada := StringReplace(NfeAssinada, chr(10), '' ,[rfReplaceall]);
PosSignature := pos('<SignatureValue>', NfeAssinada) +16;
NfeAssinada := copy(NfeAssinada, 1, PosSignature) + StringReplace(copy(NfeAssinada, posSignature, length(NfeAssinada)),'' ,'', [rfReplaceall]) ;
StrStream := TStringStream.Create();
StrStream.WriteString(NfeAssinada);
StrStream.WriteString(NfeAssinada);
// StrStream.SaveToFile('C:\exemplos\NFE\xml\NfeAssinadas\'+Copy(UriNfe, 4, 44)+ '-nfe.xml');
StrStream.SaveToFile('C:\exemplos\NFE\xml\'+Copy(UriNfe, 4, 44)+ '-nfe.xml');
result := true;
except
result := false;
end;
XmlAssinada :=nil;
XmlAssina := nil;
AssinaturaXML:=nil;
DocumentDOM := nil;
end;
código do botão conforme tutoriais
procedure TF_Nfe.btnassinarClick(Sender: TObject);
var
Busca: TSearchRec;
Arquivos: TStringList;
i: Integer;
ArquivoParaAssinar: TextFile;
ArquivoTemp: AnsiString;
Assinou: Boolean;
Diretorio, retorno: String;
begin
Diretorio := 'C:\exemplos\NFE\xml\';
if not Assigned(CertificadoAtual) then
selecionacertificado;
Arquivos := TStringList.Create;
// ShowMessage(CertificadoAtual.SerialNumber);
try
i := FindFirst(Diretorio + '*.xml', 0, Busca);
while i = 0 do
begin
Arquivos.Add(Busca.Name);
i := FindNext(Busca);
end;
for i := Arquivos.Count downto 1 do
begin
AssignFile(ArquivoParaAssinar, Diretorio + Arquivos[i - 1]);
Reset(ArquivoParaAssinar);
Readln(ArquivoParaAssinar, ArquivoTemp);
Assinou := AssinaXmlNfe(CertificadoAtual, ArquivoTemp, 'NFe');
CloseFile(ArquivoParaAssinar);
if Assinou then
ShowMessage('Assinou!')
else
ShowMessage('Não Assinou');
end;
except
on e: Exception do
ShowMessage('Houve um erro: '+ e.Message);
end;
end;
rotina que gera a assinatura do xml como estou apenas estudando esta nova tecnologia não fiz nenhuma alteração ainda
function TF_Nfe.AssinaXmlNfe(certificado: ICertificate2;
ArquivoXml,tipo: AnsiString): Boolean;
var
PosId, PosSignature, i : Integer;
{Tipo,}UriNfe: string;
NfeAssinada: AnsiString;
DocumentDOM : IXMLDOMDocument3;
AssinaturaXML: IXMLDigitalSignature;
XmlAssina, XmlAssinada: IXMLDSigKey;
MemoriaStore: istore3;
ChaverPrivada: IPrivateKey;
StrStream : TStringStream;
begin
Tipo := 'nfe';
try
if pos('<inf' + Tipo, arquivoXML)>0 then
begin
PosId := Pos('id=', ArquivoXml);
UriNfe := copy(ArquivoXml, PosId + 4, 47);
ArquivoXml := Copy(ArquivoXml, 1, pos('</'+ Tipo +'>', ArquivoXml)-1);
ArquivoXml := ArquivoXml + '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">'+
'<SignedInfo><CanonicalizationMethod Algorithm='+
'"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>'+
'<SignatureMethod Algorithm='+
'"http://www.w3.org/2000/09/xmldsig#rsa-sha1" />';
ArquivoXML := ArquivoXML + '<Reference URI="#'+ UriNFe +'"><Transforms><Transform Algorithm='+
'"http://www.w3.org/2000/09/xmldsig#enveloped-signature" />'+
'<Transform Algorithm='+
'"http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /></Transforms>'+
'<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />';
ArquivoXML := ArquivoXML + '<DigestValue></DigestValue></Reference></SignedInfo>'+
'<SignatureValue></SignatureValue><KeyInfo></KeyInfo></Signature>';
ArquivoXML := ArquivoXML + '</'+ Tipo +'>';
end;
DocumentDOM := CoDOMDocument50.Create;
with DocumentDOM do
begin
async := false;
validateOnParse := False;
preserveWhiteSpace :=true;
loadXML(ArquivoXml);
// setProperty('selectionNamespaces', 'xmlns:ds="http://www.w3.org/2000/09/xmldsig#"');
setProperty('SelectionNamespaces', 'xmlns:ds="http://www.w3.org/2000/09/xmldsig#"');
end;
AssinaturaXML := CoMXDigitalSignature50.Create;
AssinaturaXML.signature:= DocumentDOM.selectSingleNode('.//ds:Signature');
MemoriaStore := CoStore.Create;
MemoriaStore.Open(CAPICOM_MEMORY_STORE, 'Mem', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
MemoriaStore.Add(certificado);
OleCheck(IDispatch(certificado.PrivateKey).QueryInterface(iprivatekey, ChaverPrivada));
AssinaturaXML.store := MemoriaStore;
XmlAssina := AssinaturaXML.createKeyFromCSP(ChaverPrivada.ProviderType, ChaverPrivada.ProviderName, ChaverPrivada.ContainerName, 0);
XmlAssinada := AssinaturaXML.sign(XmlAssina, $00000002);
NfeAssinada := DocumentDOM.xml;
NfeAssinada := StringReplace(NfeAssinada, chr(13), '' ,[rfReplaceall]);
NfeAssinada := StringReplace(NfeAssinada, chr(10), '' ,[rfReplaceall]);
PosSignature := pos('<SignatureValue>', NfeAssinada) +16;
NfeAssinada := copy(NfeAssinada, 1, PosSignature) + StringReplace(copy(NfeAssinada, posSignature, length(NfeAssinada)),'' ,'', [rfReplaceall]) ;
StrStream := TStringStream.Create();
StrStream.WriteString(NfeAssinada);
StrStream.WriteString(NfeAssinada);
// StrStream.SaveToFile('C:\exemplos\NFE\xml\NfeAssinadas\'+Copy(UriNfe, 4, 44)+ '-nfe.xml');
StrStream.SaveToFile('C:\exemplos\NFE\xml\'+Copy(UriNfe, 4, 44)+ '-nfe.xml');
result := true;
except
result := false;
end;
XmlAssinada :=nil;
XmlAssina := nil;
AssinaturaXML:=nil;
DocumentDOM := nil;
end;
GOSTEI 0
Reijanio Ribeiro
29/04/2014
e ai victor pode me ajudar neste problema
GOSTEI 0
Reijanio Ribeiro
29/04/2014
e ai gente ninguem passou por este problema
GOSTEI 0
Eliseu Souza
29/04/2014
Acabei de ter o mesmo problema e consegui resolver seguindo a dica do "alphasistemas.net" no site Active Delphi:
O certificado original foi gerado no Win 7 64 e importado no Win 7 32 onde ocorreu o erro.
Importei o certificado gerado no Win 64 em uma maquina com Windows XP, em seguida exportei o arquivo pelo XP.
Removi o certificado anteriormente importado no Win 7 32 e instalei a copia exportada do XP.
Funcionou perfeitamente.
Eliseu.
O certificado original foi gerado no Win 7 64 e importado no Win 7 32 onde ocorreu o erro.
Importei o certificado gerado no Win 64 em uma maquina com Windows XP, em seguida exportei o arquivo pelo XP.
Removi o certificado anteriormente importado no Win 7 32 e instalei a copia exportada do XP.
Funcionou perfeitamente.
Eliseu.
GOSTEI 0