Você está na página 1de 12

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

Logo | Hospedagem de sites | Registro de domnios | Crie seu site | Crie sua loja virtual | Crie seu blog | Parceiros:

Profissionais TI Pra quem respira informao

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

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

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

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

Fechar

Assinando digitalmente um XML usando C#


Por Lus Gustavo Fabbro | 28 de julho de 2010 | Desenvolvimento, Internet, Microsoft | 10 comentrios Certificao diferencial! TwitterFacebookRSS A introduo da Nota Fiscal Eletrnica e da Escriturao Digital est dando um grande impulso no uso de Certificados Digitais, j que praticamente todas as empresas tero que adot-los para assinar os documentos eletrnicos exigidos pela Receita Federal. O formato adotado pela Receita para seus documentos eletrnicos o XML da a importncia de conhecer o processo de assin-lo. Depois de adquirir um Certificado Digital (nos Correios ou no Serasa, por exemplo), o primeiro passo para a assinatura saber como localizar esse Certificado. Mas, o que na prtica um Certificado Digital? Como que o Windows trabalha com isso? O Certificado em si, a grosso modo, apenas um arquivo onde so armazenadas informaes sobre quem outorgou o certificado (uma CA, ou Certificate Authority) e a quem que foi outorgado o certificado (uma pessoa fsica ou jurdica ou ainda um computador) bem como um cdigo pblico (a chave). O Certificado, portanto, associa uma chave pblica a uma entidade (empresa, pessoa ou computador). H um artigo no Wikipedia mais detalhado sobre esse assunto. Se voc (ou sua empresa ou seu computador) quem recebeu o certificado, voc tambm possui a chave privada, isto , o cdigo que s voc conhece e que ser usado para assinar um documento digital, garantindo-lhe a integridade, a autenticidade e conferindo validade jurdica ao documento. No Windows, o acesso aos Certificados disponveis se d de forma centralizada, atravs do Armazm de Certificados Digitais (ou Certificate Store) . Isto , uma vez que o certificado foi registrado no computador, no importa onde ele est armazenado : o acesso deve ser feito a partir do store. Para acess-lo a partir do Windows, v em Iniciar -> Executar e digite mmc \windows\system32\certmgr.msc Esse programa mostra de forma estruturada quais so os certificados presentes em seu computador: aqueles de uso exclusivo de seu usurio (Personal), as Autoridadades Certificadoras (tanto as de nvel mais alto na hierarquia certificadora as root ou raz quanto as intermedirias, que dependem da root), etc. Via programao, o framework do .NET tambm fornece uma forma estruturada de acessar o Store, atravs do namespace System.Security.Cryptography.X509Certificates. So basicamente 3 classes para acessar os certificados : X509Store : Representa o acesso ao Store. O construtor dela exige que se estipule qual parte da estrutura deve ser acessada. Use as definies na classe StoreName para identificar, por exemplo, os certificados particulares (My) ou as Autoridades Certificadoras (CA). Pode optar tambm por informar apenas a localizao, atravs da classe StoreLocation (somente os meus certicados ou todos os certificados presentes no computador). X509Certificate2Collection : Uma lista dos certificados armazenados no Store aberto com a classe anterior. X509Certificate2: Representa um certificado na coleo.

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

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

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

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

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;

Agora, s falta computar a assinatura:


signedXml.ComputeSignature();

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

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

C#, programao, XML

Autor(a): Lus Gustavo Fabbro


Bacharel em Cincias da Computao, formado pela Unesp Bauru. Foi responsvel pelos mdulos da rea industrial do ERP da ABC71 Solues em Informtica entre 1993 e 1998. Em 2002, passou a ser responsvel pela ento nascente rea de Pesquisa & Desenvolvimento da empresa. profissional certificado pela Microsoft, com especializao na arquitetura do Sistema Operacional Windows e mantem o blog Balaio Tecnolgico, dedicado a tecnologia. Veja perfil e 8 post(s) Certificao diferencial! TwitterFacebookRSS

Outros contedos interessantes


WordPress: Utilizando a funo query_po... Introduo Construo de Software ... Template tags WordPress: Comments Template Futuro ASP.net: WebForms ou MVC? Por que os sistemas operacionais pagos so gera... Engenharia de Software: Ferramentas de Design de...
Anncios Google Anncios Google

Certificado Digital Assinatura Digital Nfe XML com

Certificado Digital Assinatura Digital Nfe XML com

Confira os 10 comentrios deixados Comentar


1. anderson 19:28 em 22 de outubro de 2010 1 Ao enviar a NF-e para a fazenda ela retorna com o erro 404 rejeio uso de prefixo de namespace no permitido. ??? O que eu fao para resolver este problema. OBS: estou usando o emissor gratuito (fornecido pela sefaz) 2. Lus Gustavo Fabbro 9:56 em 25 de outubro de 2010 2 Anderson Essa mensagem do SEFAZ indica que o seu XML foi criado com namespace num n em que ele no esperado. Reveja a criao do XML, verificando onde est sendo inserido namespaces e remova os sobressalentes. Se no conseguir, poste uma parte do XML que voc criou para que possamos analis-lo ou envie-o para o email do

6 de 12

06/08/2012 22:43

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

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

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

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.

Deixe seu comentrio!


Nome * E-mail (no ser publicado) * Site

8 de 12

06/08/2012 22:43

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

9 de 12

06/08/2012 22:43

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

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

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

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?

Empregos em TI Notcias / Releases de TI


App Agenda Fix atualiza automaticamente agenda de ce... Conferncia apresenta em SP tendncias tecnolgic... Promoo: Ganhe um Treinamento PL/SQL Essen... Frum E-Commerce Brasil rene grandes nomes do com... Workshop Online Business Intelligence: Conce... + notcias | + releases

11 de 12

06/08/2012 22:43

Assinando digitalmente um XML usando C# | Profissionais TI - Pra quem ... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...

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

Você também pode gostar