FórumCategoria: Fórum - Perguntas e Respostas[EFD REINF] – Webservice RecepcaoLoteReinf em C# – problema
Claudio Costa perguntou há 7 anos

Bom dia!
Vocês podem nos ajudar?
 
Estamos com o erro [A solicitação HTTP está proibida com o esquema de autenticação de cliente ‘Anonymous’].
 
Estamos utilizando o visual studio C# para consumir o webservice RecepcaoLoteReinf  para envio da EFD-Reinf. Na chamada RecepcaoLoteReinfClient associamos o certificado  reinfLote.ClientCredentials.ClientCertificate.Certificate. Veja abaixo o código.

 
                        RecepcaoLoteReinfClient reinfLote = new RecepcaoLoteReinfClient();
                        //preprod.ReceberLoteEventosRequest reinfReceberLote = new preprod.ReceberLoteEventosRequest();
                        nodeReader.MoveToContent();
                        ReceberLoteEventosRequest loteEventosRequest = new ReceberLoteEventosRequest();
                        reinfLote.ClientCredentials.ClientCertificate.Certificate = cert; // associar o certificado
                        XElement xElement = XElement.Load(nodeReader);
                        XElement xOut = reinfLote.ReceberLoteEventos(xElement);
                        txtRetorno.Text = xOut.ToString();

 
O certificado é:
 
X509Certificate2 cert = SelecionarCertificadoAssinaturaArquivo();
 

 
        public X509Certificate2 SelecionarCertificadoAssinaturaArquivo()
        {
            X509Certificate2 vRetorna;
            X509Certificate2 oX509Cert = new X509Certificate2();
            X509Store store = new X509Store(“MY”, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
            X509Certificate2Collection collection1 = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
            X509Certificate2Collection collection2 = (X509Certificate2Collection)collection.Find(X509FindType.FindByKeyUsage, X509KeyUsageFlags.DigitalSignature, false);
            X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(collection2, “Certificado(s) Digital(is) disponível(is)”, “Selecione o certificado digital para uso no aplicativo”, X509SelectionFlag.SingleSelection);
 
            if (scollection.Count == 0)
            {
                string msgResultado = “Nenhum certificado digital foi selecionado ou o certificado selecionado está com problemas.”;
                MessageBox.Show(msgResultado, “Advertência”, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                vRetorna = null;
            }
            else
            {
                oX509Cert = scollection[0];
                vRetorna = oX509Cert;
            }
 
            return vRetorna;
        }

4 Respostas
respondeu há 7 anos

Bom dia,

A causa pode ser várias. Normalmente relacionado ao certificado.
Verifique se o mesmo ainda está válido (dentro da data de vigência).

Abraços,
Rafael Grether

Claudio Costa respondeu há 7 anos

Obrigado!

Marcos respondeu há 7 anos

Não sei como vc está fazendo, mas eu o seguinte:
gerei as classes a partir do wsdl
a partir das classes, eu fiz:
ClasseGerada v_recepcao_lote_reinf = new ClasseGerada();
v_recepcao_lote_reinf.ClientCertificates.Add(v_certificado_digital);
v_recepcao_lote_reinf.Proxy = WebRequest.GetSystemWebProxy();
v_recepcao_lote_reinf.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
 

Claudio Costa respondeu há 7 anos

ok

Claudio Costa respondeu há 7 anos

Caros,
Segue solução abaixo. Espero que ajude todos que tiverem o mesmo problema.
 
var urlServicoEnvio = ambiente;//url do webservice
var address = new EndpointAddress(urlServicoEnvio);
var binding = new BasicHttpsBinding(); //Disponível desde .NET Framework 4.5
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
var wsClient = new WSReinfXML.RecepcaoLoteReinfClient(binding, address);
wsClient.ClientCredentials.ClientCertificate.Certificate = cert; //certificado produção ou preprod
XElement xElement = XElement.Load(nodeReader);
var retornoEnvioXElement = wsClient.ReceberLoteEventos(xElement);
txtXMLRetorno.Text = retornoEnvioXElement.ToString();//xml de retorno.
wsClient.Close();
 
Att.
Claudio Costa

Roberto Andrade respondeu há 6 anos

No meu caso soh consegui fazer funcionar acrescentando mais uma linha na configuracao do binding de acordo com a documentacao da MS: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/transport-security-overview

binding.Security.Mode = BasicHttpSecurityMode.Transport;

Shaiene Pinho respondeu há 7 anos

O erro pode estar relacionado a assinatura que é Sha256 e não Sha1

Claudio Costa respondeu há 7 anos

Obrigado Shaiene!