Ir para conteúdo
  • Cadastre-se

mdbs99

Membros
  • Total de ítens

    49
  • Registro em

  • Última visita

Tudo que mdbs99 postou

  1. Legal. Mas não esqueçam do FreePascal! De qualquer forma já é um bom começo.
  2. Legal o mantenedor original do projeto ter respondido! Mas é deprimente quando ele diz que não atualiza a 12 anos e nem utiliza mais Pascal. Isso é um grande problema. Qualquer alteração na libxml2 não será replicada para a versão Pascal, pois o projeto morreu (caso ninguém tenha assumido). A primeira coisa a fazer é procurar um fork do projeto no SorceForge ou Git e saber se alguém continuou o projeto. Ou se o pessoal do ACBr assumiu ou irá assumir esse fork.
  3. OK Elton, vou analisar o código como um todo assim que possível. No que eu puder contribuir, eu irei fazê-lo. Conte comigo.
  4. Entendo. Uma boa técnica é utilizar UnitTests para verificar se nada foi quebrado. No entanto o projeto deve "nascer" assim ou é bem difícil incorporar os testes após as funcionalidades já terem sido criadas, pois haveria dependências entre as classes que não seriam compatíveis com testes "fake". É uma decisão do time do projeto.
  5. Era o que eu temia. Não há esse suporte (atualmente) no ACBr, então terei que alterar o ACBr ou extrair parte do código que faria isso... Elton, vocês tem interesse em separar toda a parte de Assinatura Digital do ACBr como um pacote independente? Ainda não sei se é possível (só depois de uma análise do código) mas seria bem interessante ter um pacote somente para Assinatura sem as dependências de NF-e.
  6. Concordo com o André, tendo fé nisso... pois preciso que seja assim!
  7. Quero fazer algo não convencional para quem utiliza apenas NF-e, eu acho. Preciso receber o XML assinado e, a partir dele, obter o CPF de quem assinou. No ACBr atual existem métodos para obter tais dados. O CPF/CNPJ é obtido através do método CertCNPF... porém o componente espera que o certificado esteja carregado (através de arquivo ou utilizando a interface do capicom). Mas eu não tenho o arquivo do certificado, apenas a assinatura no XML.
  8. Última forma: Continua com o mesmo erro. Está funcionando/validando com OpenSSL. Com CAPICOM continua a mesma mensagem. Como estava fazendo testes não tinha notado que tinha alterado para OpenSSL.
  9. Verifiquei e constatei que minha versão era de 25/06/2016.
  10. Hmm, certo. Então não foi hoje e o meu código deveria estar mesmo desatualizado. A parte do CPF, bem... se puder ajudar... é que eu preciso carregar o certificado através do XML recebido e não através do arquivo PFX. Tem alguma maneira ou terei que alterar os fontes do ACBr?
  11. Pessoal, Após atualizar (hoje) a assinatura agora está validando... Não sei se trabalharam nisso especificamente ou se foi coincidência, mas obrigado! Próximo passo agora é como saber ler o CPF da Assinatura do XML...
  12. Olá Elton, Estou verificando o XML final, já com a assinatura. No código do post anterior eu tive que usar um "XML Template" pois o ACBr não estava conseguindo gerar os nós para a assinatura (não sei se o motivo é porque estou utilizando Lazarus e pode haver alguma variação nessa parte em relação ao Delphi). Após utilizar o XML de Template, retiro todos os espaços em branco. Depois aplico a Assinatura. O XML gerado, final, é o que estou querendo Validar... e também obter o CPF do assinador (ainda não tentei essa parte). Obrigado.
  13. Olá, Gostaria de saber qual o método correto para verificar Assinaturas Digitais em arquivos XML. Meu sistema precisa receber e enviar arquivos XML assinados. Para os arquivos que o sistema recebe, é necessária a validação das assinaturas. Fiz um projeto para Assinar arquivos XML e enviar ao servidor. A assinatura está válida. Então peguei esse mesmo arquivo assinado e tentei utilizar o método VerificarAssinatura da classe TDFeSSL (utilizando CAPICOM) para ver se o componente validava a assinatura que ele mesmo fez... mas um erro ocorre: Assinatura inválida: Erro ao verificar assinatura do arquivo: Invalid Signature. Poderiam me ajudar?
  14. Eu mesmo estou adicionando no XML de template antes de chamar a Assinatura. Pelo que vi de exemplos em outras linguagens, são nós que devem ser adicionados manualmente (através da interface da classe) mesmo por não fazerem parte da assinatura padrão. Mas se não forem adicionados antes, a assinatura fica inválida. Concordo plenamente sobre adicionar esse recurso na ACBr.
  15. Daniel, Consegui fazer a assinatura! Para que funcione eu preciso fazer 3 coisas: No XML template, adicionar o nó <Object Id="Info"><SigningTime>[[data+hora]]</SigningTime></Object> dentro de <Signature> Deixar o XML de template em apenas 1 linha, sem espaços e quebra de linhas; Alterar o ACBr para que a rotina de "Ajuste da Assinatura" não altere a informação de determinados nós (Ex: <Object Id...> O código de teste está abaixo, modificado do primeiro post. Antes de passar a informação para o método A.Assinar, eu faço a "limpeza" descrita no item #2. Após o XML ter sido gerado, eu incluo novamente (manualmente) os espaços que o ACBr retirou do nó <Object Id="Info">. Depois eu envio para o servidor e a assinatura é validada. Quero alterar o ACBr para que ele aceite nós "customizados" no template e que ele não altere essas informações após a assinatura. Como não conheço completamente o código, gostaria que me desse alguma dica para que essa alteração fosse implementada da forma mais genérica possível. Assim poderei lhe enviar um patche para que possa incluir no projeto original e disponibilizar à outros desenvolvedores. O que acha? procedure TMainForm.Assinar; var A: TDFeSSL; S: AnsiString; I: Integer; begin A := TDFeSSL.Create; A.SSLLib := libCapicom; A.SelecionarCertificado; with TStringList.Create do try LoadFromFile(TemplateFileNameEdit.FileName); S := ''; for I := 0 to Count-1 do begin S := S + Trim( StringReplace( StringReplace(Strings[I], #13, '', [rfReplaceAll]), #10, '', [rfReplaceAll] ) ) end; Text := '<?xml version="1.0" encoding="iso-8859-1"?>' + A.Assinar(S, 'AssinaturaConvenio', ''); SaveToFile(OutFileNameEdit.FileName); OutMemo.Lines.Text := Text; finally Free; end; A.Free; end; Apenas para o meu caso, alterei as linhas abaixo: unit ACBrDFeSSL; function TDFeSSLClass.AjustarXMLAssinado(const ConteudoXML: String; X509DER: String): String; [...] // CAPICOM insere espaços em alguns Elementos da Assinatura // //XmlAss := RemoveEspacos(XmlAss, '<SignatureValue>', '</Signature>'); XmlAss := RemoveEspacos(XmlAss, '<SignatureValue>', '</KeyInfo>'); [...] end; Ou seja, o RemoveEspacos não vai até o fim da assinatura, deixando os nós abaixo de <KeyInfo> inalterados.
  16. Eu tentei fazer isso antes mesmo de postar aqui. Tentei inserir após a assinatura e o sistema me diz que ela está inválida. Tentei inserir antes de assinatura, e vi que o ACBr retira os espaços do nó <Object...> e de seu conteúdo... e o sistema me diz que ela está inválida. Tentei fazer o item #2 acima mas no fim inserir os espaços em branco novamente... e o sistema me diz que ela está inválida. Veja se estou entendendo certo. Você diz que somente o elemento que consta em <Reference URI=""> é assinado. No seu XML de exemplo tem: <infNFe versao="3.10" Id="NFe35160605481336000137550010000003411000003418" ... <Reference URI="#NFe35160605481336000137550010000003411000003418"> O que há em comum entre os nós acima é o número da NFe. Então você está dizendo que a assinatura irá percorrer o XML, encontrar o nó que tem o "Id" que foi sinalizado em Reference (no seu caso está em <infNFe... Id="NFe..."> e no meu está em <SolicitacaoServico Id="10000"> e assinar somente esse nó e ignorar todo o resto do arquivo? Nesse caso não deveria funcionar as opções #1 e #3 que descrevi acima, já que todo o resto do XML deveria ser ignorado?
  17. OK Daniel. Só mais uma informação: se for possível adicionar esse nó utilizando OpenSSL, resolveria meu problema. Mas é claro que seria bom termos isso solucionado em ambos e eu estou a disposição para ajudar no que for preciso. Obrigado.
  18. Daniel, Acha que ainda existe alguma possibilidade de incluir essa feature no ACBr?
  19. Essa função não é chamada porque o XML já contém o nó Signature. Se eu não adiciono o nó Signature antes de chamar o CAPICOM, o sistema não consegue fazer o load do XML, caindo nessa exception: // Carregando o AXml em XMLDOC if (not xmldoc.loadXML( WideString(AXml) )) then raise EACBrDFeException.Create('Não foi possível carregar XML'+sLineBreak+ AXml); E mesmo que essa função fosse chamada e o XMLDOC conseguisse fazer o load do XML, ainda assim no final a função remove espaços iria quebrar o nó <Object...> Não tenho certeza se tenho que adicionar a data+hora antes da assinatura ou se é a assinatura que deveria fazer isso. Acho que é a última opção mas não sei como fazer o CAPICOM adicionar esse parâmetro. Seria algo como tentaram fazer aqui: https://www.mail-archive.com/[email protected]/msg69872.html Veja a parte Signobj := CoSignedData.Create; Signobj.Content := Texto; SigningTime := CoAttribute.Create; SigningTime.Name := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME; SigningTime.Value := Now; Assinador.AuthenticatedAttributes.Add(SigningTime); s := Signobj.Sign(Assinador, True, CAPICOM_ENCODE_BASE64) ; Mas as Interfaces são bem diferentes da ACBr... então, não sei como fazer isso funcionar (e o próprio comentário do programador diz que fica diferente).
  20. Não funcionou (sem alterar nenhum fonte). Em anexo template e assinado (tem algum limite de anexos aqui?). Repare que no assinado.xml o nó <SigningTime>, além de não constar nenhum valor, foi alterado pela função RemoveEspacos (o correto seria <Object Id="Info"...). ...EY8eeLEHD53dbw==</SignatureValue><ObjectId="Info"><SigningTime/></Object><KeyInfo><X509Data>... Vou tentar fazer alguma alteração no SignatureElement... mas qualquer outra ajuda ou dica será bem vinda! assinado.xml original.xml
  21. Mas como o <SigningTime> faz parte da assinatura, acredito que isso deve ser montado pela CAPICOM. Você está me dizendo que se eu adicionar um <SigningTime/> no template a CAPICOM irá adicionar a informação automaticamente?
  22. Daniel, Já nos falamos por e-mail, meio que no início do ACBr e/ou NFe. Agradeço seu tempo previamente. Vamos lá. Arquivo XML assinado em anexo. Assinei sem considerar o novo nó. A saber: 1- Utilizo FPC 2.6 e Lazarus 1.5. 2- O sistema é para Windows, mas tentei utilizar a lib xmlsec e não funcionou (não fez o load do A3) 3- Estou utilizando um template (original.xml) para o arquivo e assinatura (em anexo) porque dá erro se o componente tentar adicionar o <signature> sem existir no XML original. 4- Meu .pfx é sem assinatura, para testes, porém não posso disponibilizar porque não é meu. 5- Já tentei adicionar o novo nó depois de assinar, mas é claro que invalidou. 6- Já tentei adicionar o novo nó no template (colocando a data/hora em hardcode mesmo só pra testar) mas o Assinador remove todos os espaços, inclusive no no <Object...> e seu conteúdo (data/hora). 7- Já tentei adicionar o novo nó no template, deixar a assinatura assinar e depois altera o conteúdo do nó (manualmente) colocando os espaços e nada. Acredito que o nó deva ser enviado ao CAPICOM antes de assinar, mas não sei como fazer isso. Em tempo, não estou trabalhando com NFe, somente com arquivos XML assinados digitalmente sendo enviados entre WebServices. assinado.xml original.xml
  23. Olá, Estou trabalhando com assinatura digital em XML, no Lazarus, e estou utilizando o código abaixo para testar (CÓDIGO 1) Parece estar funcionando. No entanto preciso que o CAPICOM insira mais um "nó" chamado SigningTime na assinatura (CÓDIGO 2). Alguém sabe como fazer? CÓDIGO 1 procedure TMainForm.Assinar; var A: TDFeSSL; begin A := TDFeSSL.Create; A.SSLLib := libCapicom; A.SelecionarCertificado; with TStringList.Create do try LoadFromFile('template.xml'); Text := UTF8Encode( '<?xml version="1.0" encoding="iso-8859-1"?>' + A.Assinar(Text, 'Assinatura', '') ); SaveToFile('assinado.xml'); finally Free; end; A.Free; end; CÓDIGO 2 [...] </KeyInfo> <Object Id="Info"> <SigningTime>29/06/2016 10:52:48</SigningTime> </Object> </Signature>
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.