Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 14 de Janeiro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
138 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Assinatura Digital para NF-e - Abordagem prática assinaturaNFe32dll
Publicado por ActiveDelphi : Segunda, Maio 05, 2008 - 12:02 GMT-3 (4990 leituras)
Comentários 9 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Victory Fernandes No último artigo da série abordamos e exemplificamos os aspectos envolvidos na especificação, aquisição e uso de certificados digitais para aplicações de NFe, mais especificamente os certificados digitais da CertiSign. Desta forma os leitores tiveram contato com um caso de sucesso cujo detalhamento da documentação deixa os leitores mais tranqüilos em realizar os investimentos necessários.

A NF-e é um documento emitido e armazenado eletronicamente, com validade jurídica garantida por processo de assinatura digital. O principal objetivo da implantação desta nova modalidade é o acompanhamento em tempo real das operações comercias pelo Fisco e a substituição do modelo atual de emissão de documentos fiscais em papel, de forma a simplificar uma série de obrigações do contribuinte. Maiores informações podem ser obtidas através do portal nacional em www.nfe.fazenda.gov.br Seguindo a linha de publicações voltadas às soluções para Nota Fiscal Eletrônica (NF-e) damos continuidade a esta série mantendo o foco no processo de assinatura digital dos mesmos, onde uma vez definido o certificado a ser utilizado, partimos para demonstrar de forma simples e prática como é possível assinar digitalmente, a partir da sua aplicação, os arquivos XML gerados. Para realizar o processo de assinatura utilizamos a assinaturaNFe32dll.dll.  

 

Gerando uma NF-e para testes de assinatura

 

Para testar a assinatura digital em uma NF-e de teste, utilizamos o aplicativo disponibilizado no site http://www.igara.com.br/produto.php?cod_produto=114 . O aplicativo mostrado da Figura 01 é um demo desenvolvido em Delphi, totalmente funcional que permite a geração de NF-e a partir de informações digitadas pelo usuário em campos de texto que seguem o layout específico vigente. Após abrir o aplicativo, clicamos no botão “Nova NF-e” e depois no botão “Salvar NF-e”. Por fim selecionamos o diretório onde desejamos salvar o arquivo .XML gerado. O aplicativo sugere um nome para o arquivo gerado e este nome não deve ser alterado, pois segue padrão de nomenclatura específico exigido com base no conteúdo da NF-e em questão.  

 

Figura 01: Aplicativo em Delphi para geração de NF-e

 

O arquivo gerado pode ser visualizado no Internet Explorer ou em qualquer outro browser de internet com suporte a XML, e o resultado é conforme mostrado na Figura 02. Neste artigo não entraremos em detalhes sobre o processo de geração da NF-e, pois este será o tema de outros artigos que virão.

  

Figura 02: Arquivo .xml de NF-e visualizado no Internet Explorer

 

Até o momento, o arquivo gerado não tem valor jurídico, pois ainda não foi assinado de forma que o emissor possa certificar a validade das informações fornecidas, bem como não há nada que garanta que este documento não foi alterado por terceiros sem o conhecimento prévio do emitente. Para tanto, é preciso assinar este documento. Em edições anteriores demonstramos como utilizar o aplicativo de assinatura de NF-e disponibilizado para download gratuito no portal oficial da NF-e em www.nfe.fazenda.gov.br. No entanto, neste artigo o objetivo é demonstrar como assinar digitalmente os arquivos a partir da sua própria aplicação, e para isso utilizaremos a assinaturaNFe32dll.dll.  

 

 

Assinatura de NFe com uso da assinaturaNFe32dll.dll  

 

Para demonstrar como é fácil assinar uma NFe, utilizaremos a assinaturaNFe32dll.dll e o aplicativo demo que acompanha a mesma pode ser obtido a partir do site http://www.igara.com.br/produto.php?cod_produto=114 . Após o download, executamos o aplicativo e clicamos no botão “1. Selecione o arquivo XML da NFe”. Um componente da classe TOpenDialog é utilizado para apresentar ao usuário uma caixa de seleção de arquivos, onde o mesmo indicará o arquivo .XML a ser assinado. O código do evento OnClick do botão é conforme mostrado a seguir.  

 

  procedure TForm1.Button12Click(Sender: TObject);   begin     opendialog1.InitialDir := ExtractFileDir(application.ExeName);     if OpenDialog1.Execute then     begin       nfe_filename := OpenDialog1.FileName;       WebBrowser1.Navigate(nfe_filename);       memo1.Lines.LoadFromFile(nfe_filename);     end;   end;

 

A Figura 03 apresenta o resultado da execução de tal procedimento, onde após a seleção do arquivo .XML, o mesmo é carregado em componentes da classe TMemo e TWebBrowser, conforme mostrado no lado esquerdo da Figura 03.

 

Figura 03: Aplicativo demo de assinatura de NF-e. Seleção da NF-e a ser assinada.

 

Uma vez carregado o arquivo desejado clique no botão “2. Assinar NFe Selecionada” para dar início ao processo de assinatura. O código executado no evento OnClick do botão é conforme segue. O procedimento executa uma chamada à função fncAssinarXML contida na dll passando como parâmetro do tipo TStrings as linhas do arquivo .XML carregado anteriormente. O resultado da chamada da função é atribuído a um segundo componente da classe TMemo. Se tudo estiver correto, o retorno da função fncAssinarXML será o arquivo da Nota Fiscal Eletrônica devidamente assinado. Caso contrário, o retorno será uma String vazia.  

 

  procedure TForm1.Button1Click(Sender: TObject);   var   nfe_assinada: String;   begin     try       nfe_assinada := fncAssinarXML(memo1.Lines);         memo2.Lines.Text := copy(nfe_assinada, 4, length(nfe_assinada));     except     exit;     end;     if memo2.Lines.Count > 0 then       showmessage('NFe assinada com sucesso');   end;

 

No momento da execução do código apresentado, surgirá uma tela para seleção do certificado digital a ser utilizado no processo de assinatura, conforme mostrado na Figura 04. Importante ressaltar que nesta tela é possível verificar as informações contidas no certificado, de forma a diferenciar os certificados entre si, para os casos de mais um certificado disponível em uma mesma máquina.

 

Figura 04: Seleção de certificado a ser utilizado no processo de assinatura.  

 

Após selecionar o certificado desejado, clique no botão “Ok”. Surgirá então a tela apresentada na Figura 05 a seguir. Neste momento, para finalizar o processo e efetivamente assinar o documento é preciso se fornecer a senha de registro do certificado digital selecionado. Conforme abordado no artigo anterior no momento da aquisição do token, uma senha de acesso deve ser fornecida, sendo pessoal e intransferível, onde somente através dela é possível se utilizar das funcionalidades do certificado.  

 

Figura 05: Confirmação de senha para uso do certificado.

 

Após preencher a senha e clicar no botão “Ok”, o arquivo .XML selecionado anteriormente será assinado e o conteúdo do XML assinado será apresentado conforme demonstrado na Figura 06 a seguir.  

 

Figura 6: Aplicativo demo de assinatura de NF-e. Assinatura da NF-e.

 

Agora basta clicar no botão “3. Salvar NFe Assinada” para que o procedimento de OnClick do botão execute a chamada a um componente da classe TSaveDialog, utilizado para apresentar ao usuário uma caixa de seleção de arquivos, onde o mesmo indicará o local onde o arquivo .XML assinado deve ser salvo. O código do evento OnClick do botão é conforme mostrado a seguir.  

 

  procedure TForm1.Button2Click(Sender: TObject);   begin     try       savedialog1.InitialDir := ExtractFileDir(application.ExeName);       SaveDialog1.FileName := ExtractFileName(nfe_filename);          if savedialog1.Execute then         memo2.Lines.SaveToFile(savedialog1.filename);     except     exit;     end;     showmessage('Arquivo de NFe salvo com sucesso')   end;

 

Qual o código necessário para chamar a função de assinatura da dll e executar esta aplicação? Primeiramente é preciso fazer a declaração da função da dll conforme mostrado a seguir  

 

  var     Form1: TForm1;     nfe_filename: String;   implementation   {$R *.dfm}   Function fncAssinarXML(sXml: TStrings): String; StdCall; external 'assinaturaNFe32dll.dll';

 

Uma vez feita a declaração, é preciso realizar uma única chamada à função de assinatura da dll conforme mostrado  

 

  memo2.Lines.Text := fncAssinarXML(memo1.Lines);

 

Note que não foi preciso ter nenhum conhecimento aprofundado sobre como se dá o processo de assinatura digital, e dessa forma abstrai-se completamente a camada relativa às funções necessárias e tecnologias utilizadas. Com a chamada de uma única função o arquivo desejado já está assinado! A diferença entre o arquivo não assinado e o arquivo assinado digitalmente estará no conteúdo das últimas chaves do arquivo XML em questão, que anteriormente estavam sem preenchimento, e após a assinatura terão um conteúdo, conforme mostrado na Figura 07.  

 

Figura 07: Arquivo .xml de NF-e após o processo de assinatura

 

Após o processo de assinatura, os campos de DigestValue, SignatureValue e X509Certificate passaram a conter dados criptografados que identificam unicamente o arquivo .XML em questão e atestam que o mesmo foi assinado somente por pessoa detentora de determinado token e da senha de acesso do mesmo. Uma vez assinada, podemos abrir e visualizar a NF-e, utilizando outro aplicativo oficial disponível para download no portal da NF-e em www.nfe.fazenda.gov.br , o aplicativo Visualizador de NF-e. Após fazer o download e instalação do aplicativo, basta clicar em Menu> Nota Fiscal> Abrir e selecionar o arquivo XML da NF-e assinada, e o resultado final será conforme mostrado na Figura 08. Se tudo correu bem, a nota fiscal será visualizada conforme mostrado a seguir. Caso existe algum problema uma mensagem de erro será apresentada.  

 

Figura 08: Arquivo .xml de NF-e, devidamente assinado, aberto no visualizador oficial do governo.

 

Uma vez aberta a NF-e, podemos ainda verificar a assinatura digital da mesma, clicando em Menu> Verificar> Assinatura Digital. Um bom teste a ser feito pelo leitor, é abrir a NF-e no NotePad ou qualquer outro editor de texto e alterar o conteúdo de qualquer nó do arquivo XML, mesmo que seja apenas uma letra. O que acontece se você acessar o programa Visualizador e pedir para verificar a Assinatura Digital novamente? O resultado do teste da assinatura digital será inválido! Claro, a assinatura identifica unicamente o arquivo e garante que não houve alterações durante as etapas do processo. Pronto! O arquivo da NF-e está pronto para ser enviado! Mas, por enquanto é só, pois o processo de envio da NF-e será tema de outros artigos que virão. Continue acompanhando a coluna pois em breve teremos mais artigos sobre o tema.  

 

 

Sobre a assinaturaNFe32dll.dll

 

A assinaturaNFe32dll.dll é um produto desenvolvido para facilitar e agilizar o processo de assinatura digital de arquivos de Nota Fiscal Eletrônica. O objetivo é disponibilizar uma solução simples e acessível a todos os desenvolvedores onde, através da chamada de uma única função, seja possível se indicar o conteúdo a ser assinado, abstraindo a complexidade desta camada, que envolve conhecimentos aprofundados acerca de funções e tecnologias de certificação. Sendo assim a dll contém um única função que recebe como parâmetro uma variável TStrings com o conteúdo a ser assinado e retorna o conteúdo devidamente assinada como String. Mais simples que isso, impossível!  

 

  Function fncAssinarXML(sXml: TStrings): String; StdCall; external 'assinaturaNFe32dll.dll';

 

O uso da dll permite ao desenvolvedor abstrair completamente a camada de assinatura do arquivo magnético, dispensando o estudo e aprofundamento teórico relativo às ferramentas e funções complexas aplicadas no processo. O produto é uma solução pioneira no mercado e dá ao desenvolvedor total flexibilidade para implementar recursos de Nota Fiscal Eletrônica em suas aplicações, adequando seus sistemas às obrigações exigidas pelo Fisco. Maiores informações, bem como o download do demo de uso do produto e da versão de avaliação 100% funcional da assinaturaNFe32dll.dll pode ser feito pelo site http://www.igara.com.br/produto.php?cod_produto=114

 

 

Descrição Simplificada do Processo  

 

De maneira simplificada o modelo operacional da NF-e pode ser assim descrito:    

 

    1. A empresa emissora da NF-e gera um arquivo eletrônico contendo as informações fiscais da operação comercial em questão.        

        a. O arquivo eletrônico tem extensão .XML (Extensible Markup Language) e deve ser gerado conforme padrão pré-estabelecido vigente.        

        b. Este documento eletrônico contém informações equivalentes às informações contidas no modelo atual de notas fiscais em papel.    

 

    2. O documento da NF-e emitido deve ser assinado digitalmente, de maneira a garantir a integridade dos dados, a autoria do emissor e a validade jurídica do documento.        

        a. O processo de assinatura digital deve ser feito utilizando-se certificado digital tipo A1 ou A3 emitido por autoridade certificadora credenciada pela Infra-estrutura de Chaves Públicas Brasileira – ICP-Brasil ( www.icpbrasil.gov.br  ).        

        b. Neste artigo foram utilizados certificados emitidos pela empresa CertSign ( www.certisign.com.br ), devidamente credenciada no ICP-Brasil.        

        c. A escolha do fornecedor do certificado abordado neste artigo se deu primeiramente pela CertSign ser devidamente certificada no ICP-Brasil e também pelo fato de ser uma das empresas líderes deste mercado e dispor de Autoridade de Registro (AR) sediada em nossa cidade, Salvador – Ba. No entanto sinta-se o leitor livre para escolher entre qualquer uma das empresas disponíveis no mercado, todas elas dispõem de processos semelhantes aos apresentados e toda a teoria mostrada no que tange a NF-e continua sendo válida.  

 

    3. O arquivo deve então ser transmitido, via Internet, para a Secretaria da Fazenda do Estado (SEFAZ) onde reside o contribuinte emissor.    

 

    4. Após receber o arquivo, a SEFAZ realiza um processo de pré-validação e devolve uma Autorização de Uso, permitindo com isso o trânsito da mercadoria e a continuação da transação comercial.  

 

    5. Para acompanhar o trânsito da mercadoria o sistema deve imprimir, em papel comum, geralmente em única via, uma representação gráfica simplificada da NF-e, chamada de DANFE (Documento Auxiliar da Nota Fiscal Eletrônica)        

        a. O DANFE deve conter impressa uma chave de acesso que possibilita a consulta da NF-e na internet, de forma que qualquer pessoa possa confirmar as informações impressas com as informações contidas no site da SEFAZ.        

        b. O DANFE não é uma nota fiscal, nem a substitui, servindo apenas como instrumento auxiliar para consulta da NF-e na internet.  

 

Atualmente, conforme consta no FAQ disponível no portal da NF-e, o Protocolo ICMS 30/07 alterou o Protocolo ICMS 10/07 e estabeleceu a obrigatoriedade de utilização NF-e a partir de 1º de abril de 2008, para os seguintes tipos de contribuintes que estejam localizados nos Estados signatários deste protocolo:    

    • fabricantes e distribuidores de cigarros.    

    • distribuidores, produtores, formuladores e importadores de combustíveis líquidos, assim definidos e autorizados por órgão federal competente.    

    • transportadores e revendedores retalhistas – TRR - assim definidos e autorizados por órgão federal competente.

 

Para os demais contribuintes, a estratégia de implantação nacional é que estes, voluntária e gradualmente, independente do porte, se interessem por emitir Nota Fiscal Eletrônica.  

 

 

Certificados Digitais

 

Os certificados digitais são documentos eletrônicos que identificam pessoas físicas ou jurídicas e através do uso de criptografia asseguram a confiabilidade, privacidade, integridade, inviolabilidade e autenticidade de informações de transações realizadas via Internet. Os conceitos detalhados sobre certificados digitais foram abordados em artigo anterior intitulado “Certificação Digital para NFe, Abordagem Prática para CertSign” cuja leitura é altamente recomendada para o melhor entendimento do presente artigo.  

 

 

Conclusão

 

Com este artigo abordamos conceitos gerais sobre assinatura digital no que tange a NF-e, e vimos como é fácil emitir e assinar tais documentos. A NF-e já é uma realidade, e muito em breve todos serão obrigados a adotar este novo formato. Mesmo as empresas não obrigadas, estão interessadas em ter seus sistemas atualizados para trabalhar nesta nova modalidade de emissão de documentos fiscais. Demos continuidade à nossa série de artigos sobre NFe, e desta vez, demonstramos como realizar de forma simples e prática a assinatura digital a partir da sua aplicação, com o uso da assinaturaNFe32dll.dll. De agora em diante, assinar uma Nota Fiscal Eletrônica é questão apenas de chamar uma função e indicar o conteúdo a ser assinado, simples assim! Victory

 

Fernandes é Professor do Departamento de Engenharia da UNIFACS, Engenheiro Mestrando em Redes de Computadores, e desenvolvedor sócio da TKS Software - Soluções de Automação e Softwares Dedicados. Pode ser contatado em victory@igara.com.br , ou através dos sites www.igara.com.br  – www.igara.com.br/victory



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: clelsonaugusto (clelson@orionsis.com.br) : Mai 08, 2008 - 09:47
(Informações sobre o membro | Enviar uma mensagem) http://
Parabéns pelo artigo. Ficou muito bom.
Mas, tenho uma duvida. Como se faz para assinar várias NFs ao mesmo sem ter que digitar a senha para cada NF? Supondo que o cliente seja um distribuidor que faz pré-venda e emite 500 NFs para entrega no dia seguinte.


por: VSF (hereim@ig.com.br) : Mai 09, 2008 - 11:39
(Informações sobre o membro | Enviar uma mensagem) http://www.igara.com.br/victory
Quando à chave é feito pelo aplicativo é preciso fornecer a senha... no entanto se o acesso for feito em loop, para assinatura de N notas q logo em seguida são adicionadas a um lote só é preciso fornecer a senha uma única vez... a assinatura32dll.dll possue tb um recurso q permite q o certificado seja selecionado uma única vez e assumido como default daí por diante... isso tb agiliza muito o processo de assinatura...

Fazendo o download do aplicativo demo completo de geração de NFe em http://www.igara.com.br/downloads/nfe/projeto_nfe32_v1.zip é possível verificar no demo de geração de Lote o processo indicado. Em breve vou postar um artigo aqui demonstrando esse processo de assinatura em massa e geração do lote!

em testes de performance para assinatura e geração de lote de grandes volumes de NFe obtive tempos médios de 1,5 segundos para cada NFe usando certificados Token USB tipo A3 da CertiSign.... sendo assim a assinuatura de um arquivo de lote com o tamanho máximo permitido de 500Kb q leva em média 50 notas levaria cerca de 1 minuto e 25 segundos.

Para certificados tipo A1 dizem ser mais rápido, mas ainda não tenho o número em mãos... assim q tiver coloco a informação aqui...

Para volumes ainda maiores podemos optar por hardwares específicos como os fornecidos pela empresa TrueAccess (www.trueaccess.com.br) que permite assinatura de até 125 notas por segundo.


por: VSF (hereim@ig.com.br) : Jul 17, 2008 - 11:03
(Informações sobre o membro | Enviar uma mensagem) http://www.igara.com.br/victory
Uma outra alternativa de para efetuar assinatura com programas de terceiros é o Assinador da ACRS disponivel para download em http://www.ac.rs.gov.br/apl/gdp/ACRS/assinador/corpo.htm


por: VSF (hereim@ig.com.br) : Out 24, 2008 - 04:48
(Informações sobre o membro | Enviar uma mensagem) http://www.igara.com.br/victory
Pessoal segue abaixo uma dica q o Gustavo enviou para mim a respeito de um problema q já foi corrido na parte de cálculo do digito verificador

function TFuncoesNFe.Calcula_DV_NFe(chave: String): String;
var
pesos: array of integer;
x, peso, sum_ponderacao, dv: integer;
begin
result := '0';
SetLength(pesos, length(chave));
peso := 1;
sum_ponderacao := 0;
for x := length(chave) - 1 downto 0 do begin
if peso = 9 then peso := 1;
peso := peso + 1;
pesos[x] := peso;
end;
for x := 1 to length(chave) do
sum_ponderacao := sum_ponderacao + StrToInt(chave[x])*pesos[x-1]; {não estava guardando a soma na variavel sum_ponderacao e vetores sem tamanho definido na declaração tem seu primeiro registro na posição 0}
if (sum_ponderacao mod 11) <= 1 then {Leva em consideração o resto da divisão e nao o digito verificador para atribuir 0}
dv := 0
else
dv := 11 - (sum_ponderacao mod 11);
if (dv>0) then
result := IntToStr(dv)
else result := '0';
end;

{ainda poderiamos melhorar esses if's ai... mas em principio acho q isso já deixa o algoritmo melhor.}

Verifiquei o problema quando recebi o retorno do lote e a msg de erro era que o digito verificador estava incorreto. Como esses seus artigos estão servindo como base para muita gente {inclusive foi a base pra mim}, acredito que seria interessante verificar este algoritmo. Afinal esse seu artigo já tem mais de 1300 visualizações.

Abraço.
Att. Gustavo
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados