Escolar Documentos
Profissional Documentos
Cultura Documentos
Logo | Hospedagem de sites | Registro de domnios | Crie seu site | Crie sua loja virtual | Crie seu blog | Parceiros:
Categorias Empregos Concursos Carreira Certificao Promoes! Cursos Livros Notcias Vdeos Releases (In)utilidades Acadmicos Aniversrios Apple Bsico Cargos de TI Carreira Celulares Certificao CMS Computao em nuvem Concursos Crimes Digitais Curso Gratuito Cursos Patrocinados
1 de 12
06/08/2012 22:43
Desenvolvimento Dia-a-Dia Dinheiro Direito Educao Empreendedorismo Emprego Engenharia de Software Equipamentos Facebook Freelance Gadgets Games Geral Gerncia de Projetos Gesto do Conhecimento Google Governana de TI Governo Histria Humor Infraestrutura Internet ITIL JQuery marketing Mercado Metodologias Microsoft Notcias de TI Opinio Outsourcing Papinho de TI Pesquisa Podcasts Publicaes Publieditorial Qualidade Rpidas e Rasteiras Redes Sade Segurana SEO Software Livre Startups Suporte Sustentabilidade Tecnologia Mvel Telecom Tendncias TI Verde Twitter Utilidades Vdeos Virtualizao Wordpress Yahoo!
2 de 12
06/08/2012 22:43
Fechar
O exemplo abaixo em C# percorre a lista de certificados na Store My, procurando os vlidos e que possuam chave privada.
X509Certificate2Collection lcerts; X509Store lStore = new X509Store (StoreName.My, StoreLocation.CurrentUser); // Abre o Store lStore.Open(OpenFlags.ReadOnly); // Lista os certificados lcerts = lStore.Certificates;
3 de 12
06/08/2012 22:43
foreach (X509Certificate2 cert in lcerts) { if (cert.HasPrivateKey && cert.NotAfter > DateTime.Now && cert.NotBefore < DateTime.Now) { // Faz o uso do certificado. // Por exemplo, assinar um docto. } } lStore.Close();
Agora que sabemos localizar um Certificado vlido, podemos partir para a assinatura propriamente dita. Para facilitar, reproduzo abaixo um excerto do XML que representa uma Nota Fiscal Eletrnica:
<?xml version=1.0 encoding=UTF-8 ?> <enviNFe versao=1.10 xmlns=http://www.portalfiscal.inf.br/nfe> <idLote>71</idLote> <NFe> <infNFe Id=NFe3508059978versao=1.10> <cUF>35</cUF> <cNF>518005127</cNF> <natOp>Venda a vista</natOp> <mod>55</mod> <serie>1</serie> <dEmi>2008-05-06</dEmi> <tpAmb>2</tpAmb> </infNFe> </NFe> </enviNFe>
A Receita Federal usou um subconjunto do padro do W3C para estipular as regras de assinatura digital da NFe. Devem ser assinados todos os elementos infNFe de um lote XML de Notas Fiscais segundo essas regras. Considerando uma varivel do tipo XmlDocument de nome doc, j montada com a estrutura correta da NFe, segue um exemplo em C# de como chegar a esse n:
XmlNodeList ListInfNFe = doc.GetElementsByTagName(infNFe);
H uma classe no namespace System.Security.Cryptography.Xml do framework .NET chamada SignedXml, que implementa o padro W3C para assinatura de documentos e verificao de documentos assinados. O trecho de cdigo abaixo exemplifica a configurao bsica desta classe:
foreach (XmlElement infNFe in ListInfNFe) { string id = infNFe.Attributes.GetNamedItem(Id).Value; signedXml = new SignedXml(infNFe); signedXml.SigningKey = ObtemCertificado().PrivateKey;
O id obtido um cdigo calculado segundo regras estipuladas pela Receita Federal e serve para identificar cada Nota. Esse id inserido como um atributo no elemento infNFe. Ele ser usado mais adiante, quando for preciso referenciar o elemento infNFe na assinatura. A funo ObtemCertificado minha: ela usa os conceitos descritos no incio desse artigo. A propriedade SigningKey a chave quer ser usada para calcular a assinatura; por isso, atribuido a ela a chave privada do certificado obtido. Parte da assinatura dedicada a descrever o n a partir do qual a assinatura foi feita e quais transformaes esse n e seus filhos sofreram antes da assinatura ser efetivamente calculada. De acordo com a documentao da Receita Federal, as transformaes a serem aplicadas so duas: 1. a que indica que a assinatura envelopada, ou seja, o trecho assinado includo na assinatura. Aqui cabe um esclarecimento: o elemento infNFe no o elemento assinado; ele na verdade usado para calcular um valor chamado de DigestValue, este sim inserido no trecho assinado, de forma que qualquer alterao no contedo de infNFe ou de seus filhos resultar num DigestValue diferente e, por fim, a assinatura tambm no ser vlida. 2. a que indica que o XML deve ser colocado na forma cannica antes do processamento. A classe Reference cuida dessa parte do processo, incluindo a identificao do n infNFe e as transformaes exigidas:
// Transformaes p/ DigestValue da Nota
4 de 12
06/08/2012 22:43
Reference reference = new Reference(# + id); reference.AddTransform(new XmlDsigEnvelopedSignatureTransform()); reference.AddTransform(new XmlDsigC14NTransform()); signedXml.AddReference(reference);
Antes de computar a assinatura, falta configurar o tratamento das informaes a respeito do certificado digital utilizado. com base nesses dados que a Receita Federal consegue validar a assinatura e atestar que nenhuma informao foi modificada depois que o emissor da Nota Fiscal a assinou. Devemos incluir uma clusula com os dados do certificado:
KeyInfo keyInfo = new KeyInfo(); keyInfo.AddClause(new KeyInfoX509Data(ObtemCertificado())); signedXml.KeyInfo = keyInfo;
Neste ponto, a varivel signedXml contm todos os dados para criar o elemento Signature (a assinatura) que deve ser includo na NFe antes do envio Receita Federal. Esse elemento deve ser includo como um n filho do elemento NFe, no mesmo nvel do n infNFe Considere a varivel xmlNFe do tipo XmlElement criada de acordo com o descrito no post sobre criao de ns no XML. Considere tambm uma instncia da classe SignedXml chamada signedXml e preparada da forma descrita acima. Vou us-las no exemplo a seguir. Primeiro, criarei um n para conter o elemento Signature. Depois, vou usar as propriedades SignedInfo e KeyInfo do signedXml para obter ns XML contendo respectivamente dados sobre a informao que foi assinada e sobre a chave usada nessa assinatura:
XmlElement xmlSignature = doc.CreateElement(Signature, http://www.w3.org/2000/09/xmldsig#); XmlElement xmlSignedInfo = signedXml.SignedInfo.GetXml(); XmlElement xmlKeyInfo = signedXml.KeyInfo.GetXml();
Note que o namespace passado para a criao do n Signature diferente daquele usado para criar as informaes da Receita Federal que usei no post sobre a criao de ns. O namespace http://www.w3.org/2000/09/xmldsig# indica que vamos usar a sintaxe de assinatura descrita no link do W3C, conforme especificado na documentao da Receita Federal. Alm dos dados que j obtivemos, necessrio ainda acrescentar a assinatura em si como n filho do elemento Signature. De acordo com a documentao, a assinatura que uma sequncia de bytes deve ser representada como um texto utilizando a codificao Base 64. A criao do n SignatureValue, sua converso para Base 64 e a adio do n ao elemento Signature esto no trecho de cdigo abaixo:
XmlElement xmlSignatureValue = doc.CreateElement(SignatureValue, xmlSignature.NamespaceURI); string signBase64 = Convert.ToBase64String(signedXml.Signature.SignatureValue); XmlText text = doc.CreateTextNode(signBase64); xmlSignatureValue.AppendChild(text); xmlSignature.AppendChild(xmlSignatureValue);
O trecho signedXml.Signature.SignatureValue onde se recupera o valor da assinatura computada. Agora, s falta importar os dados contidos nos elementos xmlSignedInfo e xmlKeyInfo obtidos no primeiro passo, acrescentado-os ao elemento NFe:
xmlSignature.AppendChild(doc.ImportNode(xmlSignedInfo, true)); xmlSignature.AppendChild (doc.ImportNode(xmlKeyInfo, true)); xmlNfe.AppendChild(xmlSignature);
Depois de acrescentar o xmlNfe ao documento XML final, deve-se transformar o XmlDocument doc em texto para ser enviado Receita Federal. Referncia: Blog Balaio Tecnolgico
5 de 12
06/08/2012 22:43
6 de 12
06/08/2012 22:43
meu blog : 3. Marclio Jr. 11:50 em 8 de dezembro de 2010 3 Estou encontrando o mesmo problema que o anderson relatou: erro 404 rejeio uso de prefixo de namespace no permitido. Estou tentando usar a verso 2.0 do Webservice. Algum poderia me orientar no que pode ser esse problema? Isso s acontece quando fao a consulta de um processamento de lote. No envio est tudo ok. 4. Lus Gustavo Fabbro 14:18 em 8 de dezembro de 2010 4 Marclio Poste o XML que est sendo enviado Receita Federal para gente poder dar uma olhada. Ou, se prefererir, envio-o ao email balaiotecnologico@gmail.com 5. Thiago 12:04 em 6 de setembro de 2011 5 timo artigo! Me ajudou muito, eu estava com alguns problemas na rotina de assinatura. Aps seguir o exemplo passo-a-passo ficou tudo ok. Abraos! 6. Fbio Freitas 17:42 em 22 de setembro de 2011 6 Ol Lus Gustavo, Esse exemplo s funciona em aplicaes desktop correto? E se a aplicao for web? Um abrao 7. Lus Gustavo Fabbro 16:42 em 23 de setembro de 2011 7 Fbio O cdigo que est no post no est restrito a aplicaes desktop ele funciona para aplicaes web tambm. Aqui na ABC71 ns construmos um servio centralizado via web para processar as notas fiscais, a incluindo a assinatura digital nos mesmos moldes do post. A nica ressalva a forma de localizar o certificado digital. O cdigo do post procura apenas no store do usurio atual mas um servio ou uma aplicao ASP/ASP.Net normalmente se logam no Windows com o usurio System. Portanto, voc teria que instalar o certificado no store do LocalMachine e busc-lo a ao invs do StoreLocation.CurrentUser. Se essa explicao no ficou clara, d uma olhada no post Funcionamento do Certificate Store do Windows para entender melhor esse recurso do Windows.
7 de 12
06/08/2012 22:43
8.
Cesar 9:28 em 26 de maro de 2012 8 Opa, fiz um esquema de XML Hierarquico, mas estou com um pequeno erro ser que vc pode me ajudar? - 71 - 35 aaa 518005127 -518005127010101019000152XXXXl LTDA MEXXXXX-R. XX Poa3011116983411411117417 Como vc pode ver o valor 518005127 deveria esta na Tag , mas esta na Tag EMIT perdido.
9.
Lus Gustavo Fabbro 14:43 em 26 de maro de 2012 9 Csar Acho que seu comentrio ficou truncado e no deu pra entender direito qual o erro que voc est tendo Poste-o novamente, junto com o trecho de seu cdigo que est criando o XML ou envie email com esses dados para meu blog : balaiotecnologico@gmail.com
10.
Cesar 10:28 em 27 de maro de 2012 10 Luis obrigado, acabei de enviar para o email balaiotecnologico@gmail.com.
8 de 12
06/08/2012 22:43
9 de 12
06/08/2012 22:43
Comentrios Recentes
Rutse: Eu sou estagirio de TI e es... Paula Winter: Problema corrigido. Obrigada... Paulo Revoredo: Mano, Esse Tuto demais!... karlan kairo de lima e silva: belo trabalho Sr: Ricardo me... Jos Eduardo Slompo: Fala Washington, Cara, a ... Ola: O seu site esta totalmente d...
10 de 12
06/08/2012 22:43
Conexo reiniciada
A conexo para o servidor foi reiniciada durante o carregamento da pgina.
Este site pode estar temporariamente fora do
Parceiros
10 + lidos do ms
Instalando o Windows XP via Pen Drive Instalar Windows 7 pelo Pen Drive Qual o salrio mdio dos profissionais de TI no Br Salrios na rea de TI Vale a pena trabalhar nes Concurso Pblico em TI: Receita Federal do Brasil Mdia salarial (2012) das 15 principais reas de T Cursos online e gratuitos das 16 melhores universi Servidor de mensagem instantnea (OpenFire) com Sp Curiosidade: Quais os navegadores de internet exis O que governana de TI?
11 de 12
06/08/2012 22:43
Lomadee, uma nova espcie na web. A maior plataforma de afiliados da Amrica Latina.
9
Tweetar
Share
Contedo licenciado sobre Creative Commons 2.5 - BY-NC-SA Profissionais TI utiliza WordPress / Hospedado por Hostnet Hospedagem de Sites Siga-nos no Twitter 35226 seguidores Assine nosso Feed 3709 assinantes Via e-mail | Via leitor Sobre Autores Seja Autor Anuncie Parceiros Contatos
12 de 12
06/08/2012 22:43