Comunidade
.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);
}
}
}
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.