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