Desenvolvimento NFS-e
Desenvolvimento NFS-e

Site destinado a desenvolvedores de softwares na integração com a NFS-e.
 
InícioInício  CalendárioCalendário  FAQFAQ  BuscarBuscar  GruposGrupos  Registrar-seRegistrar-se  Conectar-se  

Compartilhe | 
 

 Como assinar um xml com VB.Net

Ver o tópico anterior Ver o tópico seguinte Ir em baixo 
AutorMensagem
robertag



Mensagens : 2
Data de inscrição : 18/12/2013

MensagemAssunto: Como assinar um xml com VB.Net   Qua Dez 18, 2013 9:11 am

Bom dia,

Utilizo o VB 2005 e Framework 2.0, estou tentando usar a sua função porém na linha Dim signedXml As New Xml.SignedXml(docXML) gera o erro: “Overload resolution failed because no accessible ‘New’ can be called without a narrowing conversion: Public Sub New(elem As System.xml.xmlElement)’: Argument parameter ‘elem’ narrow from ‘Object’ to ‘System.Xml.XmlElement’. Public Sub New(document As system.Xml.XmlDocument’): Argument matching parameter ‘document’ narrows from ‘Object ‘ to ‘System.xml.XmlDocument’
Poderiam me ajudar?


Imports System.Xml
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates
Imports System.Security.Cryptography.Xml
Imports System.IO

Public Function SelecionarCertificado() As String
   Try

     'Representa um certificado X509
     Dim objCertificadoX509 As New X509Certificate2

     'Representa o local onde os certificados X509 são armazenados
     'Seleciona os certificados locais e do usuário atual
     Dim getCertificadosX509 As New X509Store("MY", StoreLocation.CurrentUser)
     getCertificadosX509.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly)

     'Representa uma coleção de objetos X509Certificate2
     Dim objColecaoCertificadosX509 As New X509Certificate2Collection

     'Abre a caixa de diálogo com os certificados diponiveis
     objColecaoCertificadosX509 = X509Certificate2UI.SelectFromCollection(getCertificadosX509.Certificates, _
     "Certificado(s) Digital(is) disponível(is)", "Selecione o certificado digital para uso no aplicativo", _
     X509SelectionFlag.SingleSelection)

     'Verifica se existe algum certificado selecionado
     If objColecaoCertificadosX509.Count > 0 Then
       'Mostra o assunto do certficado selecionado
       'lblCertificado.Text = objColecaoCertificadosX509.Item(0).Subject.ToString
       'Adiciona o número do serial na variável
       p_NumeroSerialCertificado = objColecaoCertificadosX509.Item(0).SerialNumber.ToString
     End If
   Catch ex As Exception
     MsgBox(ex.Message)
   End Try

   SelecionarCertificado = p_NumeroSerialCertificado
 End Function

 Private Sub AssinarDocumentoXML(ByVal ArqXMLAssinar As String, ByVal TagXML As String)

   Try

     'Pega o conteúdo XML que será assinado
     Dim srdDocXml As StreamReader
     Dim strXML As String
     Dim strTagXml As String = TagXML

     srdDocXml = File.OpenText(ArqXMLAssinar)
     strXML = srdDocXml.ReadToEnd()
     srdDocXml.Close()

     'Representa uma coleção de objetos X509Certificate2
     Dim objColecaoCertificadosX509 As X509Certificate2Collection = Nothing

     'Instância que representa um certificado X509
     Dim objCertificadoX509 As New X509Certificate2()

     'Representa o local onde os certificados X509 são armazenados e
     'seleciona os certificados locais e do usuário atual
     Dim getCertificadosX509 As New X509Store("MY", StoreLocation.CurrentUser)

     'Abrir em modo de leitura e apenas os certificados existentes
     getCertificadosX509.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly)

     'Procure por certificados usando o número serial como parâmetro, o último parâmetro indica para a
     'função retornar somente certificados válidos
     objColecaoCertificadosX509 = getCertificadosX509.Certificates.Find(X509FindType.FindBySerialNumber, p_NumeroSerialCertificado, True)

     'Verifica se existe algum certificado selecionado
     If objColecaoCertificadosX509.Count > 0 Then

       'Selecionar o certificado e armazena na váriavel
       objCertificadoX509 = objColecaoCertificadosX509.Item(0)
       Dim docXML = New XmlDocument() 'Iniciamos um novo documento XML

       docXML.PreserveWhitespace = False 'Não deixar espaços no documento
       docXML.Load(ArqXMLAssinar) 'Carrega o XML

       'Retorna a quantidade de tags de assinatura, deve existir apenas uma.
       If docXML.GetElementsByTagName(strTagXml).Count = 1 Then

         'Classe usada para assinar o documento XML
         Dim signedXml As New Xml.SignedXml(docXML)
         'Configura a chave de assinatura
         signedXml.SigningKey = objCertificadoX509.PrivateKey

         'Representa o elemento de referência da assinatura digital do XML
         Dim Referencia As New Xml.Reference()
         ' Representar a idendificação do elemento de assinatura
         Referencia.Uri = ""

         'Essa classe remove os elementos de assintura <Signature> antes de
         'criar um digest do documento XML.
         Dim env As New XmlDsigEnvelopedSignatureTransform

         'Adicionamos o elemento na referência
         Referencia.AddTransform(env)

         'Representa a canonização C14N XML
         Dim c14 As New XmlDsigC14NTransform

         'Adicionamos o elemento na referência
         Referencia.AddTransform(c14)

         'Adiciona as referências na assinatura
         signedXml.AddReference(Referencia)

         'A Classe KeyInfo representa o elemento <KeyInfo> da assinatura digital
         Dim KeyInfo As New KeyInfo

         'Carrega o certificado usando o objetoKeyInfoX509Data e
         'adiciona ao elemento <KeyInfo>
         KeyInfo.AddClause(New KeyInfoX509Data(objCertificadoX509))

         'Adiciona o objeto KeyInfo na assinatura
         signedXml.KeyInfo = KeyInfo
         'Computa a assinatura digital
         signedXml.ComputeSignature()

         'Cria um novo elemento XML
         Dim xmlDigitalSignature As XmlElement
         'Pega a assinatura digital e adiciona ao elemento
         xmlDigitalSignature = signedXml.GetXml()

         ' Gravar o elemento no final do documento XML
         docXML.DocumentElement.AppendChild(docXML.ImportNode(xmlDigitalSignature, True))

         'Salva o documento XML já assinado
         Dim EscreverXML As New StreamWriter(ArqXMLAssinar)
         EscreverXML.Write(docXML.OuterXml)
         EscreverXML.Close()

       End If

     End If

   Catch ex As Exception

     MsgBox(ex.Message)

   End Try

 End Sub
Voltar ao Topo Ir em baixo
 
Como assinar um xml com VB.Net
Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo 
Página 1 de 1
 Tópicos similares
-
» [Resolvido] Como que eu faço para aceitar assinatura ?
» [PEIDO] Como subir arquivos no 4Shared/Mediafire
» Como anda a tela do seu PC?
» Como conserto isso?
» Como fazer um bg com Brushes

Permissão deste fórum:Você não pode responder aos tópicos neste fórum
Desenvolvimento NFS-e  :: Arquivo XML-
Ir para: