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?

.NET
.NET
Tecnologias da Microsoft baseadas na estrutura de software do .NET.
27 perguntas
ASP.NET
ASP.NET
Um conjunto de tecnologias no .NET Framework para criar aplicativos Web e serviços Web XML.
8 perguntas
0 comentários Sem comentários
{count} votos

3 respostas

Classificar por: Mais útil
  1. Jonathan Pereira Castillo 7,930 Pontos de reputação Fornecedor da Microsoft
    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.

    0 comentários Sem comentários

  2. Jonathan Pereira Castillo 7,930 Pontos de reputação Fornecedor da Microsoft
    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.

    0 comentários Sem comentários

  3. Jonathan Pereira Castillo 7,930 Pontos de reputação Fornecedor da Microsoft
    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!

    0 comentários Sem comentários

Sua resposta

As respostas podem ser marcadas como Respostas Aceitas pelo autor da pergunta, o que ajuda os usuários a saber a resposta que resolveu o problema do autor.