Comunidade

Ask a Question
Back to All

.Net Core 3.1 - The SSL connection could not be established

Estou com um problema para me comunicar com a API sandbox para PIX:
https://secure.sandbox.api.pagseguro.com

Não consigo fazer funcionar no meu servidor.

region Leitura dos certificados

        var rsaPem = File.ReadAllText("wwwroot/PagSeguro/Clica_Sandbox.key");
        rsaPem = rsaPem.Replace("-----BEGIN RSA PRIVATE KEY-----", "").Replace("-----END RSA PRIVATE KEY-----", "");
        var key = RSA.Create();
        key.ImportRSAPrivateKey(Convert.FromBase64String(rsaPem), out _);

        var certPem = File.ReadAllText("wwwroot/PagSeguro/Clica_Sandbox.pem");
        certPem = certPem.Replace("-----BEGIN CERTIFICATE-----", "").Replace("-----END CERTIFICATE-----", "");
        var cert = new X509Certificate2(Convert.FromBase64String(certPem));
        var certWithKey = cert.CopyWithPrivateKey(key);
        #endregion Leitura dos certificados

        ServicePointManager.ServerCertificateValidationCallback = delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            
        var handler = new HttpClientHandler
        {
            ClientCertificateOptions = ClientCertificateOption.Manual,
            SslProtocols = SslProtocols.Tls12,
            ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }
        };
        handler.ClientCertificates.Add(certWithKey);

        var client = new HttpClient(handler);
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _pagSeguroConfig.TokenPix);
        client.BaseAddress = new Uri(_pagSeguroConfig.PAG_SEGURO_URL_PIX);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

Dai dá erro:
client.PutAsync(method, content).Result;

Ola Mauro, eu recomendo você utilizar o RestSharp, ele simplifica a chamada.

veja um exemplo, estou utilizando a versão 108.0.1 (https://www.nuget.org/packages/RestSharp/108.0.1):

using RestSharp;
using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace client
{
  class Program
  {
    private const string BASE_URL = "https://secure.sandbox.api.pagseguro.com";
    private const string PIX_OAUTH = "pix/oauth2";
    private const string CLIENT_ID = "4b544024-0000-0000-0000-0242ac120000";
    private const string CLIENT_SECRET = "5c9ed9a2-00000-0000-0000-0242ac120000";

    static void Main(string[] args)
    {
      var certFile = @"/home/crt/sandbox.pem";
      var certKey = @"/home/crt/sandbox.key";

      var certificate = X509Certificate2.CreateFromPemFile(certFile, certKey);

      var options = new RestClientOptions(BASE_URL)
      {
        MaxTimeout = -1,
        FollowRedirects = false,
        ClientCertificates = new X509CertificateCollection() { certificate }
      };

      var client = new RestClient(options);

      var tokenPixBytes = Encoding.UTF8.GetBytes(CLIENT_ID + ":" + CLIENT_SECRET);
      var tokenBase64 = Convert.ToBase64String(tokenPixBytes);


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


      var request = new RestRequest(PIX_OAUTH, Method.Post);
      request.AddHeader("Authorization", $"Basic {tokenBase64}");
      request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
      request.AddParameter("grant_type", "client_credentials");
      request.AddParameter("scope", "pix.read pix.write cob.read cob.write");

      var response = client.Execute(request);

      Console.WriteLine(response.Content);
    }
  }

}
Marked as answered by Weser Pistori Rodrigues

esse projeto esta no .NET 6.0, mas funciona no 3.1 também.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="RestSharp" Version="108.0.1" />
  </ItemGroup>

</Project>

Cara eu troquei todo o método por RestSharp e continua o mesmo erro: The SSL connection could not be established

Estou tentando fazer uma cobrança PIX.

"PagSeguroConfiguration": {
"PAG_SEGURO_URL_PIX": "https://secure.sandbox.api.pagseguro.com",
"TokenPix": "1f275fec-0297-43da-a211-a00880aab8fa9ce674b0414aa330715c76d16df9c678e489-db45-4113-839f-549cdc0a8329"
},

private (bool, string) PutPIX(string method, object data)
{
var rsaPem = File.ReadAllText("wwwroot/PagSeguro/ClicaSandbox.key");
rsaPem = rsaPem.Replace("-----BEGIN RSA PRIVATE KEY-----", "").Replace("-----END RSA PRIVATE KEY-----", "");
var key = RSA.Create();
key.ImportRSAPrivateKey(Convert.FromBase64String(rsaPem), out
);

        var certPem = File.ReadAllText("wwwroot/PagSeguro/Clica_Sandbox.pem");
        certPem = certPem.Replace("-----BEGIN CERTIFICATE-----", "").Replace("-----END CERTIFICATE-----", "");
        var cert = new X509Certificate2(Convert.FromBase64String(certPem));
        var certWithKey = cert.CopyWithPrivateKey(key);

        var options = new RestClientOptions(_pagSeguroConfig.PAG_SEGURO_URL_PIX)
        {
            MaxTimeout = -1,
            FollowRedirects = false,
            ClientCertificates = new X509CertificateCollection() { certWithKey }
        };

        var client = new RestClient(options);

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

        var request = new RestRequest(new Uri($"{_pagSeguroConfig.PAG_SEGURO_URL_PIX}/{method}"), Method.Put);
        request.AddHeader("Accept", "application/json");
        request.AddHeader("Authorization", _pagSeguroConfig.TokenPix);
        request.AddHeader("Content-type", "application/json");
        request.AddParameter("application/json", JsonConvert.SerializeObject(data), ParameterType.RequestBody);
        var response = client.Execute(request);

        return (response.IsSuccessful, response.Content);
    }

Boa tarde. Montei um exemplo, seguindo o mesmo principio q enviei. da uma olhada. funcionou normal.

using RestSharp;
using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.Json;

namespace client
{
  class Program
  {
    private const string BASE_URL = "https://secure.sandbox.api.pagseguro.com";
    private const string PIX_OAUTH = "pix/oauth2";
    private const string CLIENT_ID = "4b544024";
    private const string CLIENT_SECRET = "5c9ed9a2";

    static void Main(string[] args)
    {
      var certFile = @"/home/crt/sandbox.pem";
      var certKey = @"/home/crt/sandbox.key";


      var certificate = X509Certificate2.CreateFromPemFile(certFile, certKey);

      var options = new RestClientOptions(BASE_URL)
      {
        MaxTimeout = -1,
        FollowRedirects = false,
        ClientCertificates = new X509CertificateCollection() { certificate }
      };

      var client = new RestClient(options);

      var tokenPixBytes = Encoding.UTF8.GetBytes(CLIENT_ID + ":" + CLIENT_SECRET);
      var tokenBase64 = Convert.ToBase64String(tokenPixBytes);


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


      var request = new RestRequest(PIX_OAUTH, Method.Post);
      request.AddHeader("Authorization", $"Basic {tokenBase64}");
      request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
      request.AddParameter("grant_type", "client_credentials");
      request.AddParameter("scope", "pix.read pix.write cob.read cob.write");

      var response = client.Execute(request);

      Console.WriteLine(response.Content);

      var token = JsonSerializer.Deserialize<Token>(response.Content);
      Console.WriteLine(token.access_token);



      request = new RestRequest($"/instant-payments/cob/165816358316581635831658160004", Method.Put);
      request.AddHeader("Authorization", $"Bearer {token.access_token}");
      request.AddHeader("Content-Type", "application/json");
      request.AddParameter("application/json", "{\n \"valor\": {\n \"original\": \"16.00\"\n },\n \"chave\": \"d7a3ecdb-f492-000-000-247718addf29\"\n}",  ParameterType.RequestBody);

      response = client.Execute(request);

      Console.WriteLine(response.Content);


    }

    
  }

}

Fiz esse método para testar,
Ele acha os certificados, as configurações estão normais, mas ainda assim dá "The SSL connection could not be established" e o meu client.Content vem null

Meu projeto está em .net core 3.1 rodando em um windows server 2019

private string GetPIXToken()
{
// Leitura dos certificados
var rsaPem = File.ReadAllText("wwwroot/PagSeguro/ClicaSandbox.key");
rsaPem = rsaPem.Replace("-----BEGIN RSA PRIVATE KEY-----", "").Replace("-----END RSA PRIVATE KEY-----", "");
var key = RSA.Create();
key.ImportRSAPrivateKey(Convert.FromBase64String(rsaPem), out
);

        var certPem = File.ReadAllText("wwwroot/PagSeguro/Clica_Sandbox.pem");
        certPem = certPem.Replace("-----BEGIN CERTIFICATE-----", "").Replace("-----END CERTIFICATE-----", "");
        var cert = new X509Certificate2(Convert.FromBase64String(certPem));
        var certificate = cert.CopyWithPrivateKey(key);
        // Leitura dos certificados

        var options = new RestClientOptions(_pagSeguroConfig.PAG_SEGURO_URL_PIX)
        {
            MaxTimeout = -1,
            FollowRedirects = false,
            ClientCertificates = new X509CertificateCollection() { certificate }
        };

        var client = new RestClient(options);

        var tokenPixBytes = Encoding.UTF8.GetBytes(_pagSeguroConfig.CLIENT_ID + ":" + _pagSeguroConfig.CLIENT_SECRET);
        var tokenBase64 = Convert.ToBase64String(tokenPixBytes);

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

        var request = new RestRequest("pix/oauth2", Method.Post);
        request.AddHeader("Authorization", $"Basic {tokenBase64}");
        request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
        request.AddParameter("grant_type", "client_credentials");
        request.AddParameter("scope", "pix.read pix.write cob.read cob.write");

        var response = client.Execute(request);

        var token = JsonConvert.DeserializeObject<PIXToken>(response.Content);
        return token.access_token;
    }

Mauro, você chegou a testar via postman?
eu testei em uma outra maquina com a versão 3.1 do .netcore e funcionou também.
tente testar via postman, para ver se o certificado esta válido.

Pelo postman tenho 2 respostas:

Quando eu executo o post ele me retorna:
{
"error_messages": [
{
"code": "41003",
"description": "invalid_client"
}
]
}

Porem quando eu executo o botão "Get New Access Token" da aba authorization ele me retorna o token.

É isso mesmo ???
Pq via código fonte ainda não vai =(

Estou com mesmo problema, meu projeto estado rodando .net core 3.1, se alguem puder me ajudar agradeço.

Estou com o mesmo problema. mas para o Santander. Aqui foi o canal que mais se identifica com o meu problema. Os outros só fala em colocar clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, SslPolicyErrors) => { return true; }; que funciona. mas não aqui.



© 1996-2025 Todos os direitos reservados.

PAGSEGURO INTERNET INSTITUIÇÃO DE PAGAMENTO S/A - CNPJ/MF 08.561.701/0001-01

Av. Brigadeiro Faria Lima, 1.384, São Paulo - SP - CEP 01451-001

English
Powered by Localize
Português (Brasil)