Você está na página 1de 12

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
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
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!
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
2 de 12 06/08/2012 22:43
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 umarquivo 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) bemcomo umcdigo 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 tambmpossui 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 emseu 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 tambmfornece 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 coma classe anterior.
X509Certificate2: Representa umcertificado na coleo.
O exemplo abaixo em C#percorre a lista de certificados na Store My, procurando os vlidos e que possuamchave
privada.
X509Cer t i f i cat e2Col l ect i on l cer t s;
X509St or e l St or e = new X509St or e ( St or eName. My, St or eLocat i on. Cur r ent User ) ;
// Abre o Store
l St or e. Open( OpenFl ags. ReadOnl y) ;
// Lista os certificados
l cer t s = l St or e. Cer t i f i cat es;
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
3 de 12 06/08/2012 22:43
f or each ( X509Cer t i f i cat e2 cer t i n l cer t s)
{
i f ( cer t . HasPr i vat eKey && cer t . Not Af t er > Dat eTi me. Now && cer t . Not Bef or e < Dat eTi me. Now)
{
// Faz o uso do certificado.
// Por exemplo, assinar um docto.
}
}
l St or e. Cl ose( ) ;
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 ?>
<envi NFe ver sao=1.10 xml ns=http://www.portalfiscal.inf.br/nfe>
<i dLot e>71</ i dLot e>
<NFe>
<i nf NFe I d=NFe3508059978ver sao=1.10>
<cUF>35</ cUF>
<cNF>518005127</ cNF>
<nat Op>Venda a vista</ nat Op>
<mod>55</ mod>
<ser i e>1</ ser i e>
<dEmi >2008-05-06</ dEmi >
<t pAmb>2</ t pAmb>
</ i nf NFe>
</ NFe>
</ envi NFe>
A Receita Federal usou umsubconjunto do padro do W3C para estipular as regras de assinatura digital da NFe. Devemser
assinados todos os elementos infNFe de umlote XML de Notas Fiscais segundo essas regras. Considerando uma varivel do
tipo XmlDocument de nome doc, j montada coma estrutura correta da NFe, segue um exemplo emC#de como chegar a
esse n:
Xml NodeLi st Li st I nf NFe = doc. Get El ement sByTagName( i nf NFe) ;
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:
f or each ( Xml El ement i nf NFe i n Li st I nf NFe)
{
st r i ng i d = i nf NFe. At t r i but es. Get NamedI t em( I d) . Val ue;
si gnedXml = new Si gnedXml ( i nf NFe) ;
si gnedXml . Si gni ngKey = Obt emCer t i f i cado( ) . Pr i vat eKey;
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:
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 umvalor chamado
de DigestValue, este siminserido 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.
1.
a que indica que o XML deve ser colocado na forma cannica antes do processamento. 2.
A classe Reference cuida dessa parte do processo, incluindo a identificao do n infNFe e as transformaes exigidas:
// Transformaes p/ DigestValue da Nota
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
4 de 12 06/08/2012 22:43
Ref er ence r ef er ence = new Ref er ence( # + i d) ;
r ef er ence. AddTr ansf or m( new Xml Dsi gEnvel opedSi gnat ur eTr ansf or m( ) ) ;
r ef er ence. AddTr ansf or m( new Xml Dsi gC14NTr ansf or m( ) ) ;
si gnedXml . AddRef er ence( r ef er ence) ;
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 comos dados do certificado:
KeyI nf o keyI nf o = new KeyI nf o( ) ;
keyI nf o. AddCl ause( new KeyI nf oX509Dat a( Obt emCer t i f i cado( ) ) ) ;
si gnedXml . KeyI nf o = keyI nf o;
Agora, s falta computar a assinatura:
si gnedXml . Comput eSi gnat ur e( ) ;
Neste ponto, a varivel signedXml contmtodos 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:
Xml El ement xml Si gnat ur e = doc. Cr eat eEl ement ( Si gnat ur e, ht t p: / / www. w3. or g/ 2000/ 09/ xml dsi g# ) ;
Xml El ement xml Si gnedI nf o = si gnedXml . Si gnedI nf o. Get Xml ( ) ;
Xml El ement xml KeyI nf o = si gnedXml . KeyI nf o. Get Xml ( ) ;
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 coma 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:
Xml El ement xml Si gnat ur eVal ue = doc. Cr eat eEl ement ( Si gnat ur eVal ue, xml Si gnat ur e. NamespaceURI ) ;
st r i ng si gnBase64 = Conver t . ToBase64St r i ng( si gnedXml . Si gnat ur e. Si gnat ur eVal ue) ;
Xml Text t ext = doc. Cr eat eText Node( si gnBase64) ;
xml Si gnat ur eVal ue. AppendChi l d( t ext ) ;
xml Si gnat ur e. AppendChi l d( xml Si gnat ur eVal ue) ;
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:
xml Si gnat ur e. AppendChi l d( doc. I mpor t Node( xml Si gnedI nf o, t r ue) ) ;
xml Si gnat ur e. AppendChi l d ( doc. I mpor t Node( xml KeyI nf o, t r ue) ) ;
xml Nf e. AppendChi l d( xml Si gnat ur e) ;
Depois de acrescentar o xmlNfe ao documento XML final, deve-se transformar o XmlDocument doc emtexto para ser
enviado Receita Federal.
Referncia: Blog Balaio Tecnolgico
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
5 de 12 06/08/2012 22:43
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 emInformtica 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...

Confira os 10 comentrios deixados Comentar
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)
1.
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 emque 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
2.
Anncios Google
Certificado Digital
Assinatura Digital Nfe
XML com
Anncios Google
Certificado Digital
Assinatura Digital Nfe
XML com
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
6 de 12 06/08/2012 22:43
meu blog :
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.
3.
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
4.
Thiago
12:04 em 6 de setembro de 2011
5
timo artigo!
Me ajudou muito, eu estava comalguns problemas na rotina de assinatura. Aps seguir o exemplo passo-a-passo ficou
tudo ok.
Abraos!
5.
Fbio Freitas
17:42 em 22 de setembro de 2011
6
Ol Lus Gustavo,
Esse exemplo s funciona emaplicaes desktop correto? E se a aplicao for web?
Um abrao
6.
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 umservio 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 umservio 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.
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
7 de 12 06/08/2012 22:43
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.
8.
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 como trecho de seu cdigo que est criando o XML ou envie email com esses dados para meu blog :
balaiotecnologico@gmail.com
9.
Cesar
10:28 em 27 de maro de 2012
10
Luis obrigado, acabei de enviar para o email balaiotecnologico@gmail.com.
10.
Deixe seu comentrio!
Nome *
E-mail (no ser publicado) *
Site
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
8 de 12 06/08/2012 22:43
Assinando digitalmente umXML 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
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...
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
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 emTI: Receita Federal do Brasil
Mdia salarial (2012) das 15 principais reas de T
Cursos online e gratuitos das 16 melhores universi
Servidor de mensageminstantnea (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 umTreinamento PL/SQL Essen...
Frum E-Commerce Brasil rene grandes nomes do com...
Workshop Online Business Intelligence: Conce...
+notcias | +releases
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
11 de 12 06/08/2012 22:43
Lomadee, uma nova espcie na web. A maior plataforma de afiliados da
Amrica Latina.
Tweetar
9
1
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
Share Share
Assinando digitalmente umXML usando C#| Profissionais TI - Pra quem... http://www.profissionaisti.com.br/2010/07/assinando-digitalmente-um-xm...
12 de 12 06/08/2012 22:43

Você também pode gostar