CONS CAD - CADASTRO DE EMITENTES SEFAZ

LORENABIEL 28/11/2012 11:13:34
#414945
Olá,
Bom dia.
Vê se vocês podem me ajudar...
Estou tentando fazer uma consulta cadastro de emitentes em vb.net.
Consegui gerar o xml.
<?xml version=[Ô]1.0[Ô] encoding=[Ô]utf-8[Ô] ?>
- <ConsCad versao=[Ô]2.00[Ô] xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>
- <infCons>
<xServ>CONS-CAD</xServ>
<UF>BA</UF>
<CNPJ>05404332000155</CNPJ>
</infCons>
</ConsCad>
O problema é que eu não estou conseguindo assinar esse xml....
Dá um erro com a seguinte mensagem: [Ô]Elemento de referência mal formado.[Ô]
Estou utilizando a seguinte função:
Public Sub Assinar(ByVal pArqXMLAssinar As String, ByVal pUri As String, _
ByVal strCertificado As String)
[ô]Atualizar atributos de retorno com conteúdo padrão
Me.vResultado = 0
Me.vResultadoString = [Ô]Assinatura realizada com sucesso[Ô]

Dim SR As StreamReader = Nothing

Try
Dim pCertificado As New X509Certificate2()
[ô]Abrir o arquivo XML a ser assinado e ler o seu conteúdo
SR = File.OpenText(pArqXMLAssinar)
Dim vXMLString As String = SR.ReadToEnd()
SR.Close()

Try
[ô] Verifica o certificado a ser utilizado na assinatura
Dim _xnome As String = [Ô][Ô]
If pCertificado IsNot Nothing Then
[ô]_xnome = pCertificado.Subject.ToString()
End If

Dim _X509Cert As New X509Certificate2()
Dim store As New X509Store([Ô]MY[Ô], StoreLocation.CurrentUser)
store.Open(OpenFlags.[ReadOnly] Or OpenFlags.OpenExistingOnly)
Dim collection As X509Certificate2Collection = DirectCast(store.Certificates, X509Certificate2Collection)
Dim collection1 As X509Certificate2Collection = DirectCast(collection.Find(X509FindType.FindBySubjectDistinguishedName, strCertificado, False), X509Certificate2Collection)
[ô]If collection.Item(0)Then
If collection1.Count = 0 Then
Me.vResultado = 2
Me.vResultadoString = [Ô]Problemas no certificado digital[Ô]
Else
[ô] certificado ok
_X509Cert = collection1(0)
Dim x As String
x = _X509Cert.GetKeyAlgorithm().ToString()

[ô] Create a new XML document.
Dim doc As New XmlDocument()

[ô] Format the document to ignore white spaces.
doc.PreserveWhitespace = False

[ô] Load the passed XML file using it’s name.
Try
doc.LoadXml(vXMLString)

[ô] Verifica se a tag a ser assinada existe é única
Dim qtdeRefUri As Integer = doc.GetElementsByTagName(pUri).Count

If qtdeRefUri = 0 Then
[ô] a URI indicada não existe
Me.vResultado = 4
Me.vResultadoString = [Ô]A tag de assinatura [Ô] & pUri.Trim() & [Ô] não existe[Ô]
Else
[ô] Exsiste mais de uma tag a ser assinada
If qtdeRefUri > 1 Then
[ô] existe mais de uma URI indicada
Me.vResultado = 5
Me.vResultadoString = [Ô]A tag de assinatura [Ô] & pUri.Trim() & [Ô] não é unica[Ô]
Else
Try
[ô] Create a SignedXml object.
Dim signedXml As New SignedXml(doc)

[ô] Add the key to the SignedXml document
signedXml.SigningKey = _X509Cert.PrivateKey

[ô] Create a reference to be signed
Dim reference As New Reference()

[ô] pega o uri que deve ser assinada
Dim _Uri As XmlAttributeCollection = doc.GetElementsByTagName(pUri).Item(0).Attributes
Dim xy As Integer = 0
For Each _atributo As XmlAttribute In _Uri
If _atributo.Name = [Ô]Id[Ô] Then
xy = 1
reference.Uri = [Ô]#[Ô] & _atributo.InnerText
End If
Next
If IsNothing(reference.Uri) Then
reference.Uri = [Ô]#[Ô]
End If
[ô] Add an enveloped transformation to the reference.
Dim env As New XmlDsigEnvelopedSignatureTransform()

reference.AddTransform(env)

Dim c14 As New XmlDsigC14NTransform()
reference.AddTransform(c14)

[ô] Add the reference to the SignedXml object.
signedXml.AddReference(reference)

[ô] Create a new KeyInfo object
Dim keyInfo As New KeyInfo()

[ô] Load the certificate into a KeyInfoX509Data object
[ô] and add it to the KeyInfo object.
keyInfo.AddClause(New KeyInfoX509Data(_X509Cert))

[ô] Add the KeyInfo object to the SignedXml object.
signedXml.KeyInfo = keyInfo
signedXml.ComputeSignature() <-- o erro acontece aqui

[ô] Get the XML representation of the signature and save
[ô] it to an XmlElement object.
Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()

[ô] Gravar o elemento no documento XML
doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))
XMLDoc = New XmlDocument()
XMLDoc.PreserveWhitespace = False
XMLDoc = doc

[ô] Atualizar a string do XML já assinada
Me.vXMLStringAssinado = XMLDoc.OuterXml

[ô] Gravar o XML no HD
Dim SW_2 As StreamWriter = File.CreateText(pArqXMLAssinar)
SW_2.Write(Me.vXMLStringAssinado)
SW_2.Close()
Catch caught As Exception
Me.vResultado = 6
Me.vResultadoString = [Ô]Erro ao assinar o documento - [Ô] & caught.Message
End Try
End If
End If
Catch caught As Exception
Me.vResultado = 3
Me.vResultadoString = [Ô]XML mal formado - [Ô] & caught.Message
End Try
End If
Catch caught As Exception
Me.vResultado = 1
Me.vResultadoString = [Ô]Problema ao acessar o certificado digital - [Ô] & caught.Message
End Try
Catch ex As Exception
Me.vResultado = 1
Me.vResultadoString = [Ô]Falha ao tentar abrir/ler o arquivo XML - [Ô] & ex.Message
Finally
Try
SR.Close()
Catch ex As Exception

End Try

End Try
End Sub
O que poderia estar errado?
Grata desde já.
KERPLUNK 28/11/2012 11:22:45
#414946
Resposta escolhida
Em que linha ocorre o erro(acostume-se a chamar de exceção)?
LORENABIEL 28/11/2012 11:28:03
#414947
A exceção ocorre nessa linha:
signedXml.ComputeSignature() <-- o erro acontece aqui
Na verdade ocorre porque no xml nao existe o atributo Id que ele busca nesse bloco:
For Each _atributo As XmlAttribute In _Uri
If _atributo.Name = [Ô]Id[Ô] Then
xy = 1
reference.Uri = [Ô]#[Ô] & _atributo.InnerText
End If
Next
O problema é que se eu coloco o atributo Id no xml a sefaz rejeita.
KERPLUNK 28/11/2012 11:32:49
#414948
E porque simplesmente não muda o atributo, para o nome que deve ser assinado?
LORENABIEL 28/11/2012 11:34:22
#414949
Faz sentido... Vou ver aqui...
LORENABIEL 28/11/2012 11:49:37
#414951
Muito obrigada deu certo....
Era justamente isso como não exite o campo Id eu passei o atributo onde ele vai ser assinado que no caso foi: infCons
Obrigada pela resposta rápida... Show!!!
KERPLUNK 28/11/2012 11:53:56
#414953
De nada, por favor feche o tópico.
Tópico encerrado , respostas não são mais permitidas