Ler Certificado Pasta Azure App Service

Antonio Lopes 0 Pontos de reputação
2024-08-17T17:17:42.2766667+00:00

Boa tarde, Tenho uma aplicação .net hospedada no serviço de aplicações e estou tentando fazer uma integração com um banco via api, localmente funciona, o token é gerado corretamente, porém quando é hospedada no azure não funciona, o trecho de código está abaixo.

O certificado é carregado corretamente para a pasta e está valido.

private string GetAccessToken()

{

  try

  {          

      // Configurações

      var authUrl = _config["Boleto:Url_Auth"];

      var clientId = _config["Boleto:Client_Id"];

      string senhaPfx = _config["Boleto:SenhaCertPfx"]; 

      var clientSecret = clientId;                   

      string diretorioDoProjeto = AppDomain.CurrentDomain.BaseDirectory;          

      string caminhoDaPastaReports = Path.Combine(diretorioDoProjeto, "Certificado");          

      string caminhoDoArquivo = Path.Combine(caminhoDaPastaReports, "certificado.pfx");          

      var certPath = Path.Combine(caminhoDoArquivo);

	  var certificate = new X509Certificate2(certPath, senhaPfx);

      // Configurar as opções do RestClient para usar o certificado

      var options = new RestClientOptions($"{authUrl}/URL")

      {

          MaxTimeout = -1,

          ClientCertificates = new X509CertificateCollection { certificate }

      };

      // Criar o cliente e a requisição

      var client = new RestClient(options);

      var request = new RestRequest("", Method.Post);

      request.AddHeader("Content-Type", "application/x-www-form-urlencoded");

     // request.AddHeader("Cookie", "TS01dfa94a=017a3a183bb25bfbf7003004f5db3bb7575362a5772fc45c9e184e8341f3b7eb6d5672ac206c2d56ed38ed9b1975820b7df1a8f09d83ac5c3cf219ef822da6d3a5cdc3af3d0d8d766358e9da05f9fd2842bd702cea; 447fb61b35fb4f9d67cbcbbebfb597fc=cfd190176d94003bbcc0bf16258c7a42; TS012629b2=017a3a183b144ba5d392ab920903f46eae8a801a4c2fc45c9e184e8341f3b7eb6d5672ac206c2d56ed38ed9b1975820b7df1a8f09d306ac3c5ae37a3ca2e0ea74c2d34e57f");

      request.AddParameter("grant_type", "client_credentials");

      request.AddParameter("client_id", clientId);

      request.AddParameter("scope", "boletos_inclusao boletos_consulta boletos_alteracao");

      // Executar a requisição

      RestResponse response = client.Execute(request);

      if (response.IsSuccessful)

      {

          dynamic result = JsonConvert.DeserializeObject(response.Content.ToString());

          // Retornar o token de acesso

          return result.access_token;

      }

      else

      {         

          return null;

      }

  }

  catch (Exception ex)

  {

      var e = ex;

      throw;

  }

}

E recebo o seguinte erro: System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception. ---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception. ---> System.ComponentModel.Win32Exception (0x8009030D): The credentials supplied to the package were not recognized at System.Net.SSPIWrapper.AcquireCredentialsHandle(ISSPIInterface secModule, String package, CredentialUse intent, SCH_CREDENTIALS* scc) at System.Net.Security.SslStreamPal.AcquireCredentialsHandle(CredentialUse credUsage, SCH_CREDENTIALS* secureCredential) at System.Net.Security.SslStreamPal.AcquireCredentialsHandleSchCredentials(SslAuthenticationOptions authOptions) at System.Net.Security.SslStreamPal.AcquireCredentialsHandle(SslAuthenticationOptions sslAuthenticationOptions, Boolean newCredentialsRequested) --- End of inner exception stack trace --- at System.Net.Security.SslStreamPal.AcquireCredentialsHandle(SslAuthenticationOptions sslAuthenticationOptions, Boolean newCredentialsRequested) at System.Net.Security.SslStream.AcquireCredentialsHandle(SslAuthenticationOptions sslAuthenticationOptions, Boolean newCredentialsRequested) at System.Net.Security.SslStream.AcquireClientCredentials(Byte[]& thumbPrint, Boolean newCredentialsRequested) at System.Net.Security.SslStream.GenerateToken(ReadOnlySpan1 inputBuffer, Byte[]& output) at System.Net.Security.SslStream.NextMessage(ReadOnlySpan1 incomingBuffer) at System.Net.Security.SslStream.ProcessBlob(Int32 frameSize) at System.Net.Security.SslStream.ReceiveBlobAsyncTIOAdapter at System.Net.Security.SslStream.ForceAuthenticationAsyncTIOAdapter at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken) --- End of inner exception stack trace --- at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem) at System.Threading.Tasks.TaskCompletionSourceWithCancellation1.WaitWithCancellationAsync(CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.HttpConnectionWaiter1.WaitForConnectionAsync(Boolean async, CancellationToken requestCancellationToken) at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpClient.g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) at RestSharp.RestClient.ExecuteRequestAsync(RestRequest request, CancellationToken cancellationToken)

Alguém já teve esse problema?

Tecnologias de desenvolvedor | .NET | Outro
Tecnologias de desenvolvedor | ASP.NET Core | Outro
0 comentários Sem comentários

4 respostas

Classificar por: Mais Antigo
  1. JonathanPe 17,675 Pontos de reputação Moderador
    2024-08-19T16:52:37.8166667+00:00

    Oi Antonio Lopes!

    Bem-vindo ao Microsoft Q&A!

    Código este específico não é suportado pelos fóruns da Microsoft, ainda deixe-me tentar ajudá-lo como uma extramile.

    Parece que você está enfrentando um problema de autenticação SSL ao tentar carregar o certificado no Azure App Service. Aqui estão algumas sugestões para resolver o problema:

    Verifique o Caminho do Certificado: Certifique-se de que o caminho do certificado está correto e que o arquivo certificado.pfx está realmente presente no diretório especificado. Permissões do Certificado: Verifique se o certificado tem as permissões corretas para ser acessado pelo aplicativo hospedado no Azure. Formato do Certificado: Certifique-se de que o certificado está no formato correto e que a senha (senhaPfx) está correta. Configurações do Azure App Service: No portal do Azure, vá para o seu App Service e verifique as configurações de SSL/TLS. Certifique-se de que o certificado está corretamente configurado e vinculado ao seu aplicativo. Código de Carregamento do Certificado: Tente ajustar o código para carregar o certificado diretamente do armazenamento de certificados do Azure em vez de um arquivo físico. Isso pode ser feito usando o Azure Key Vault para armazenar e acessar o certificado de forma segura. Aqui está um exemplo de como você pode carregar o certificado do Azure Key Vault:

    C#

    using Azure.Identity;
    using Azure.Security.KeyVault.Certificates;
    using Azure.Security.KeyVault.Secrets;
    var keyVaultUrl = "https://<your-key-vault-name>.vault.azure.net/";
    var certificateName = "<your-certificate-name>";
    var client = new CertificateClient(new Uri(keyVaultUrl), new DefaultAzureCredential());
    KeyVaultCertificateWithPolicy certificate = client.GetCertificate(certificateName);
    var secretClient = new SecretClient(new Uri(keyVaultUrl), new DefaultAzureCredential());
    KeyVaultSecret secret = secretClient.GetSecret(certificateName);
    var privateKeyBytes = Convert.FromBase64String(secret.Value);
    var certificateWithPrivateKey = new X509Certificate2(privateKeyBytes, (string)null, X509KeyStorageFlags.MachineKeySet);
    

    Logs e Diagnósticos:

    Verifique os logs de diagnóstico do Azure App Service para obter mais detalhes sobre o erro. Isso pode fornecer informações adicionais sobre o que está causando a falha de autenticação.

    Espero que essas dicas ajudem a resolver o problema! Se precisar de mais assistência, estou à disposição.

    Saudações

    Jonathan.

    -----------

    Se você acha que as informações fornecidas acima resolveram sua dúvida, agradeceríamos se você pudesse marcá-la como "Aceite a resposta se achar útil". Isso nos ajuda a manter a qualidade e a relevância das soluções em nosso fórum.

    Esta resposta foi útil?

    0 comentários Sem comentários

  2. JonathanPe 17,675 Pontos de reputação Moderador
    2024-10-08T16:52:52.16+00:00

    Oi Antonio Lopes!,

    O objetivo desta mensagem é verificar as informações fornecidas. Se tiver mais atualizações sobre este assunto, por favor, não hesite em responder neste mesmo tópico.

    Cuidadosamente                 

    Jonathan

    -----------

    Se você acha que as informações fornecidas acima resolveram sua dúvida, agradeceríamos se você pudesse marcá-la como "Aceite a resposta se achar útil". Isso nos ajuda a manter a qualidade e a relevância das soluções em nosso fórum.

    Esta resposta foi útil?

    0 comentários Sem comentários

  3. JonathanPe 17,675 Pontos de reputação Moderador
    2024-10-24T20:36:30.4533333+00:00

    Bom dia Antonio Lopes!,

    Conforme as informações anteriormente fornecidas, o objetivo desta mensagem é realizar uma verificação das mesmas. Caso possua novas atualizações referentes a este assunto, por favor, sinta-se à vontade para responder neste mesmo tópico.

    Atenciosamente,

    Jonathan

    -----------

    Sua opinião é muito importante para nós! Se esta resposta resolveu sua consulta, por favor clique em ‘YES‘. Isso nos ajuda a melhorar continuamente a qualidade e relevância de nossas soluções. Obrigado pela sua colaboração!

    Esta resposta foi útil?

    0 comentários Sem comentários

  4. JonathanPe 17,675 Pontos de reputação Moderador
    2025-01-02T15:35:28.0333333+00:00

    Olá Antonio Lopes!,

    Como não obtivemos retorno de sua parte, procederemos com o encerramento deste tópico de discussão. No entanto, gostaríamos de lembrá-lo que está sempre à vontade para iniciar um novo tópico em nosso fórum sempre que necessitar de assistência adicional ou desejar retomar a conversa. Caso considere que as informações já fornecidas esclareceram suas dúvidas, ficaríamos gratos se pudesse marcar a resposta como ‘Aceita’, caso a tenha encontrado útil. Isso contribui significativamente para a manutenção da qualidade e pertinência das soluções oferecidas em nosso fórum.

    Agradecemos sua participação e esperamos continuar a oferecer-lhe suporte valioso no futuro

    Jonathan

    -----------

    Sua opinião é muito importante para nós! Se esta resposta resolveu sua consulta, por favor clique em ‘YES‘. Isso nos ajuda a melhorar continuamente a qualidade e relevância de nossas soluções. Obrigado pela sua colaboração!

    Esta resposta foi útil?

    0 comentários Sem comentários

Sua resposta

As respostas podem ser marcadas como ‘Aceitas’ pelo autor da pergunta e ‘Recomendadas’ pelos moderadores, o que ajuda os usuários a saber a resposta que resolveu o problema do autor.