# Requisição de Web API com Certificado

**URL:** <https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226>\
**Category:** Ajuda & Suporte\
**Tags:** web-api, csharp\
**Created:** [Abril 23, 2024, 11:32am UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226 "2024-04-23T11:32:14Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Abril 23, 2024, 11:32am UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/1 "2024-04-23T11:32:14Z")

</div>

Bom dia,

Estamos desenvolvendo uma página que precisará fazer uma requisição a uma API que demanda o envio de um certificado digital a cada chamada. Qual a forma ideal para eu subir esse certificado e como fazer para acessar seu caminho por dentro de um form do latromi?

Eu fiz um código c# local na minha máquina mas estou com dificuldades de transcrevê-lo para o latromi, seria mais ou menos isso:

```cs
using System;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using Newtonsoft.Json;

public class TokenResponse
{
    public string access_token { get; set; }
}

public class ProdAuthentication
{
    public string GetToken(string clientId, string clientSecret)
    {
        string tokenEndpoint = "ENDPOINT_API";
        string grantType = "client_credentials";
        string certificatePath = "PATH_CERTIFICADO";
        string certificatePassword = "SENHA_CERTIFICADO";

        try
        {
            X509Certificate2 certificate = new X509Certificate2(certificatePath, certificatePassword, X509KeyStorageFlags.DefaultKeySet);

            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(tokenEndpoint);
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";
            request.ClientCertificates.Add(certificate);

            var data = Encoding.ASCII.GetBytes($"grant_type={Uri.EscapeDataString(grantType)}&client_id={Uri.EscapeDataString(clientId)}&client_secret={Uri.EscapeDataString(clientSecret)}");
            request.ContentLength = data.Length;

            using (Stream stream = request.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(responseStream))
                    {
                        string jsonResponse = reader.ReadToEnd();
                        TokenResponse tokenResponse = JsonConvert.DeserializeObject<TokenResponse>(jsonResponse);
                        return tokenResponse.access_token;
                    }
                }
            }
        }
        catch (WebException webEx)
        {
            string responseText = string.Empty;
            if (webEx.Response != null)
            {
                using (var streamReader = new StreamReader(webEx.Response.GetResponseStream()))
                {
                    responseText = streamReader.ReadToEnd();
                }
            }

            throw new Exception("Erro ao solicitar o token.\r\nDetalhe: " + webEx.Message + "\r\nResposta: " + responseText);
        }
        catch (Exception ex)
        {
            throw new Exception("Erro ao solicitar o token.\r\nDetalhe: " + ex.Message);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Substitua os valores de clientId e clientSecret pelos valores corretos
        string clientId = "CLIENT_ID";
        string clientSecret = "CLIENT_SECRET";

        try
        {
            ProdAuthentication prodAuth = new ProdAuthentication();
            string tokenResponse = prodAuth.GetToken(clientId, clientSecret);
            Console.WriteLine("Token obtido com sucesso:");
            Console.WriteLine(tokenResponse);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Erro ao obter o token:");
            Console.WriteLine(ex.Message);
        }
    }
}

```

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Maio 3, 2024, 3:23pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/2 "2024-05-03T15:23:55Z")

</div>

Olá @Rafael!

Para adaptar o código, você precisa considerar que o Latromi espera um código que possa ser executado dentro de um método. É como um “ **Bloco anônimo** ” de código C#.

Então primeiramente, precisamos remover a declaração de classes e de métodos, deixando apenas o código que será executado.

Ao invés de receber os dados dos argumentos do método C#, precisamos modificar para buscar de **Variáveis** , **Campos** ou **Argumentos** (do Procedimento). E quanto ao resultado, precisamos devolver o valor para uma **Variável** ou **Campo** do Formulário.

Segue abaixo o código adaptado:

```cs
using System;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using Newtonsoft.Json;

// Recebe "clientId" e "secret" via parâmetros do procedimento (argumentos);
string clientId = (string)Arguments["clientId"].Value;
string clientSecret = (string)Arguments["secret"].Value;

string tokenEndpoint = "ENDPOINT_API";
string grantType = "client_credentials";
string certificatePath = "PATH_CERTIFICADO";
string certificatePassword = "SENHA_CERTIFICADO";

// Limpa variável do Form que armazena o "access_token"
Variables["v_access_token"].Value = "";

try
{
    X509Certificate2 certificate = new X509Certificate2(certificatePath, certificatePassword, X509KeyStorageFlags.DefaultKeySet);

    ServicePointManager.Expect100Continue = true;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(tokenEndpoint);
    request.ContentType = "application/x-www-form-urlencoded";
    request.Method = "POST";
    request.ClientCertificates.Add(certificate);

    var data = Encoding.ASCII.GetBytes($"grant_type={Uri.EscapeDataString(grantType)}&client_id={Uri.EscapeDataString(clientId)}&client_secret={Uri.EscapeDataString(clientSecret)}");
    request.ContentLength = data.Length;

    using (Stream stream = request.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    using (Stream responseStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(responseStream))
    {
        string jsonResponse = reader.ReadToEnd();
        var tokenResponse = JsonConvert.DeserializeObject<dynamic>(jsonResponse);

        // Preenche variável do Formulário com o "access_token"
        Variables["v_access_token"].Value = tokenResponse.access_token;
    }
}
catch (WebException webEx)
{
    string responseText = string.Empty;
    if (webEx.Response != null)
    {
        using (var streamReader = new StreamReader(webEx.Response.GetResponseStream()))
        {
            responseText = streamReader.ReadToEnd();
        }
    }

    throw new Exception("Erro ao solicitar o token.\r\nDetalhe: " + webEx.Message + "\r\nResposta: " + responseText);
}
catch (Exception ex)
{
    throw new Exception("Erro ao solicitar o token.\r\nDetalhe: " + ex.Message);
}

```

A seção de declações "using" não é aceita dentro de um método, mas o Latromi trata este bloco de uma maneira especial. 

Note que estou recebendo os valores de “clientId” e “secret” da propriedade “Arguments” (argumentos do Procedimento):

 ![image](https://community.latromi.com.br/uploads/default/original/2X/3/3a4cca2e7149b1d7a8456ec05d827c2269e630b1.png)

Note também que o resultado está sendo retornado para a variável do Formulário “v\_access\_token”:

```cs
 // Preenche variável do Formulário com o "access_token"
 Variables["v_access_token"].Value = tokenResponse.access_token;

```

Agora basta chamar este procedimento a partir de outro, como por exemplo, a partir do Procedimento associado ao Click de um botão. Para chamar um procedimento, use a ação “Chamar Procedimento”.

 ![image](https://community.latromi.com.br/uploads/default/original/2X/2/2f1dc80c6cdc2720d36aca0b44da59756d458e06.png)

Para finalizar, vou deixar o link de alguns tópicos relacionados ao assunto:

- [Código C# no Formulário Dinâmico](https://community.latromi.com.br/t/codigo-c-no-formulario-dinamico/405)
- [Obter um Token OAuth 2.0 com C#](https://community.latromi.com.br/t/obter-um-token-oauth-2-0-com-c/1142)

---

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Maio 3, 2024, 4:03pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/3 "2024-05-03T16:03:41Z")

</div>

Boa tarde Daniel,

Obrigado pelo retorno. Mas e quanto a questao do certificado? Essa API que vou consumir demanda o envio do certificado a cada requisição, tanto na obtenção do token de acesso como depois no consumo das funções específicas. Como testei localmente no meu ambiente, indicar um path onde o certificado está e depois atribuir com:

```nohighlight
X509Certificate2 certificate = new X509Certificate2(certificatePath, certificatePassword, X509KeyStorageFlags.DefaultKeySet);

```

é tranquilo. Qual a forma ideal pra eu conseguir fazer isso via latromi?

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Maio 3, 2024, 4:55pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/4 "2024-05-03T16:55:49Z")

</div>

Basta informar na variável “certificatePath” o caminho do certificado **no servidor** onde o site está hospedado.

---

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Maio 3, 2024, 5:37pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/5 "2024-05-03T17:37:20Z")

</div>

E como eu vejo essa estrutura de pastas/diretórios? Só costumo upar arquivos aqui:

 ![image](https://community.latromi.com.br/uploads/default/original/2X/6/6c0fdfbd3cd3f043cf827ef09b6eb7baa47b7569.png)

Mas de qualquer forma nao tem o path raiz

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Maio 3, 2024, 5:42pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/6 "2024-05-03T17:42:50Z")

</div>

Você precisa acessar o servidor (Windows Server) através de um acesso remoto, e colocar o certificado em uma pasta. Se você não tiver acesso, peça para o responsável pela sua infraestrutura colocar o certificado em uma pasta para você.

---

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Maio 7, 2024, 1:11pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/7 "2024-05-07T13:11:08Z")

</div>

Bom dia Daniel,

Consegui subir o arquivo do certificado digital para o servidor. Tentei adaptar o código para o padrão que tu forneceu no tópico:

[Obter um Token OAuth 2.0 com C#](https://community.latromi.com.br/t/obter-um-token-oauth-2-0-com-c/1142)

Cheguei nisso adicionando a parte do certificado:

```cs
using System;
using System.IO;
using System.Reflection;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography.X509Certificates;
using Newtonsoft.Json;

string tokenEndpoint = "XXXXX";
string clientId = "XXXXX";
string clientSecret = "XXXXX";
string grantType = "client_credentials";
string certificatePath = @"XXXXX";
string certificatePassword = "XXXXX";

// Carregue o certificado digital
X509Certificate2 certificate = new X509Certificate2(certificatePath, certificatePassword);

// Configurar o HttpClientHandler com o certificado
HttpClientHandler handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);

using (HttpClient client = new HttpClient(handler))
{
    // Crie os parâmetros do form-data
    var formData = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("grant_type", grantType),
        new KeyValuePair<string, string>("client_id", clientId),
        new KeyValuePair<string, string>("client_secret", clientSecret),
    }); 

    // Faça a solicitação POST para o endpoint do tokena
    var response = client.PostAsync(tokenEndpoint, formData).Result;

    // Garanta que a solicitação foi bem-sucedida
    response.EnsureSuccessStatusCode();

    // Leia o resultado da requisição
    var result = response.Content.ReadAsStringAsync().Result;
    
    // Deserialize o JSON usando a biblioteca NewtonSoft usando "dynamic"
    var tokenResult = JsonConvert.DeserializeObject<dynamic>(result);

    // Preencha a variável com o valor da propriedade "access_token" do JSON.
    Variables["token"].Value = (string)tokenResult.access_token;
}

```

Quando realizo a chamado estou tendo o seguinte erro:

![image](https://community.latromi.com.br/uploads/default/original/2X/3/39cac144a24a19698d166f919900bfcaf262b54a.png)

Removendo a parte do handler do certificado, a requisição “funciona” retornando o status 403 de forbidden:

![image](https://community.latromi.com.br/uploads/default/original/2X/9/9b3766c11f4362447d5887a5adc0d4d1255aeeb6.png)

Eu testei o path no servidor onde o certificado está e consigo listar os arquivos da pasta, então imagino que não seja um problema de acesso.

O código funciona localmente na minha máquina então pensei que pudesse ser alguma especificidade do latromi no tratamento desse handler.

Consegue me auxiliar com alguma indicação?

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Maio 7, 2024, 1:36pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/8 "2024-05-07T13:36:07Z")

</div>

> [@Rafael](#):
>
> Quando realizo a chamado estou tendo o seguinte erro:
> 
> ![image](https://community.latromi.com.br/uploads/default/original/2X/3/39cac144a24a19698d166f919900bfcaf262b54a.png)

A “Exception” original está “escondida” dentro do AggregateException.

Tenta trocar o `.Result` por `.GetAwaiter().GetResult()`. Isso deve fazer com que a Exception original seja exibida:

```cs
var result = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();

```

---

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Maio 7, 2024, 1:58pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/9 "2024-05-07T13:58:29Z")

</div>

O erro ta sendo ja na chamada, alterei para:

```nohighlight
 var response = client.PostAsync(tokenEndpoint, formData).GetAwaiter().GetResult();

```

Porém a mensagem de erro recebida é muito genérica:

![image](https://community.latromi.com.br/uploads/default/original/2X/7/783e9e675d1fa092b32471c8da3189b498db7d66.png)

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Maio 7, 2024, 2:25pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/10 "2024-05-07T14:25:04Z")

</div>

Tenta envolver o seu código em blobo try/catch para tentar extrair informações mais detalhadas:

```cs
using System;
using System.IO;
using System.Reflection;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography.X509Certificates;
using Newtonsoft.Json;

try
{
    ...
    ...
    ...
}
catch(Exception ex)
{
    throw new InvalidOperationException(ex.ToString());
}

```

---

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Maio 7, 2024, 2:33pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/11 "2024-05-07T14:33:16Z")

</div>

Esta é a mensagem de erro obtida:

```txt
Uma exceção foi acionada pelo destino de uma chamada. Erro ao executar o código C# dinâmico. System.Net.Http.HttpRequestException: Ocorreu um erro ao enviar a solicitação. 
---> System.Net.WebException: A solicitação foi anulada: Não foi possível criar um canal seguro para SSL/TLS.
em System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
em System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
--- Fim do rastreamento de pilha de exceções internas ---
em System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em LATROMI.DynamicLib.FRM00001128100049520240506160231880305.Main.M3A614E8D85F64AB7873DB27127B772C2()

```

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Maio 7, 2024, 5:46pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/12 "2024-05-07T17:46:40Z")

</div>

> [@Rafael](#):
>
> Não foi possível criar um canal seguro para SSL/TLS.

Essa mensagem geralmente indica que o servidor de onde está partindo a requisição não tem os pacotes de cripografia necessários para estabelecer a comunicação com o servidor destino.

Mais informações neste tópico: [Não foi possível criar um canal seguro para SSL/TLS](https://community.latromi.com.br/t/nao-foi-possivel-criar-um-canal-seguro-para-ssl-tls/978)

Qual versão do **Windows Server** é usada no servidor?

---

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Maio 7, 2024, 6:47pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/13 "2024-05-07T18:47:20Z")

</div>

Essa é a configuração do servidor:

 ![server](https://community.latromi.com.br/uploads/default/original/2X/e/edf0fd114853740d9e7dcbb15d5a8c4a8772afd7.png)

E esses são os protocolos suportados pela endereço destino obtidos no link do tópico mencionado:

 ![host](https://community.latromi.com.br/uploads/default/original/2X/1/1738911d70acd78de717a1c8723f3c81dbfe7ff7.png)

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Maio 7, 2024, 8:44pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/14 "2024-05-07T20:44:36Z")

</div>

@Rafael, você precisa comparar os recursos de criptografia do seu servidor com o servidor que você está tentando conectar.

No tópico que recomendei, tem um site chamado [SSL Server Test](https://www.ssllabs.com/ssltest/). Lá você coloca o domínio que quer acessar, e ele te devolve os recursos de criptografia que estão disponíveis (só aceitam conexões de servidores que atendam aqueles requisitos).

Você precisa verificar no servidor de origem (onde o Latromi está instalado) tem os recursos necessários para estabeler a conexão.

Você tentou o executar o IIS Crypto?

---

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Maio 8, 2024, 12:00pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/15 "2024-05-08T12:00:15Z")

</div>

Bom dia Daniel,

A questão é que eu não tenho acesso ao servidor onde o latromi está, é o pessoal da praxio que gerencia, então eu preciso indicar pra eles o que deve ser feito.

Pelo que me passaram tanto SSL como TLS estão ativos:

![image](https://community.latromi.com.br/uploads/default/original/2X/0/02e8cf1328c442397eb204c1e4577b0ec16e39fc.png)

E o servidor destino usa esses que estão habilitados pelo que entendi:

 ![image](https://community.latromi.com.br/uploads/default/original/2X/b/bfdf1cd60eed0e8607dff933af8f3f56404b3803.png)

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Maio 8, 2024, 1:16pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/16 "2024-05-08T13:16:45Z")

</div>

Bom dia @Rafael!

Não são apenas os protocolos, mas os **Conjuntos de Criptografia** (Cipher Suits) também precisam ser levados em consideração.

[Nessa página da Microsoft](https://learn.microsoft.com/pt-br/windows/win32/secauthn/tls-cipher-suites-in-windows-10-v1809), você encontra a relação de todos os Conjuntos de Criptografias disponíveis no **Windows Server 2019**.

Você precisa verificar se pelo menos um **Conjunto de Criptografia** (Cipher Suit) habilitado no servidor destino está disponível no **Windows Server 2019**. Se encontrar algum, ele pode estar apenas desabilitado, e pode ser habilitado pelo [IIS Crypto](https://www.nartac.com/Products/IISCrypto/).

---

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Maio 9, 2024, 1:22pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/17 "2024-05-09T13:22:07Z")

</div>

Bom dia Daniel,

esse é o host do servidor destino: sts.itau.com.br, que pode utilizar essas cipher suites:

 ![image](https://community.latromi.com.br/uploads/default/original/2X/1/1e64168a2b7765036a08b04c3213c824b02e89d5.png)

Me retornaram que todas as cipher suites já estavam habilitadas no windows server do servidor do latromi:

 ![cipher](https://community.latromi.com.br/uploads/default/original/2X/b/bb76f7a229be7275df6eb6dd346e3203f082f8cd.png)

Mas o problema segue, o que mais eu poderia fazer pra detectar o problema?

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Maio 14, 2024, 3:12am UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/18 "2024-05-14T03:12:15Z")

</div>

Olá @Rafael!

Pela configuração, parece que os conjuntos de criptografia estão de acordo nas duas pontas.

Existem duas coisas que ainda podem ser tentadas:

- Usar a opção **Best Practices** do **IIS Crypto** , e reiniciar o servidor.
- Usar um usuário com perfil de administrador para executar o Pool de Aplicativos do IIS.

Se não resolver, crie um ticket de atendimento em [https://latromi.freshdesk.com/](https://latromi.freshdesk.com/), informando todas as informações necessárias para reproduzir essa requisição de Web API.

---

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Junho 5, 2024, 1:52pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/19 "2024-06-05T13:52:12Z")

</div>

Olá @Rafael!

Após realizar algumas pesquisas e também alguns testes, descobri que o problema pode estar nos privilégios associados a **Identidade** usada no **Pool de Aplicativos**. Por padrão, o Pool é criado com a Identidade “ApplicationPoolIdentity”, que é a que possui menos privilégios do que as outras.

Tente usar “NetworkService” ou “LocalSystem”:

 ![image](https://community.latromi.com.br/uploads/default/original/2X/a/a0a845bd5a8a1456c935e8228bd9897c6cb3f1d2.png)

Neste link tem explicações sobre cada Identidade:

> **[Understanding identities in IIS - Internet Information Services](https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/iis/www-authentication-authorization/understanding-identities)**
>
> This article provides background information about identities in Internet Information Services.

---

<div class="post-metadata">

**Author:** ![Rafael](https://community.latromi.com.br/letter_avatar_proxy/v4/letter/r/4da419/32.png) [@Rafael](https://community.latromi.com.br/u/Rafael)\
**Post date:** [Junho 5, 2024, 2:47pm UTC](https://community.latromi.com.br/t/requisicao-de-web-api-com-certificado/1226/20 "2024-06-05T14:47:12Z")

</div>

Bom dia Daniel,

Era isso mesmo, ajustamos o servidor e funcionou.

Muito obrigado pelo apoio nesse processo todo, exigiu bastante coisa!
