Histórico de mensagens sobre ssl em pix

EXIBINDO CONVERSAS RECENTES:

Texto: ssl
Canal: pix
Avatar discord do usuario luizgerencianet

luizgerencianet

# Gerar certificado e chave separadas
openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys #certificado
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes #chave privada

Avatar discord do usuario ajcastello

ajcastello

certo, estou pesquisando para entender melhor como aplicar o mTLS ao Firebase, porém com dificuldade, uma vez que ele possui uma lib para as functions e já aplica um SSL.

Avatar discord do usuario bruno_2z1790

bruno_2z1790

Conseguimos resolver 😄 na verdade era um problema bem simples....

Estavamos utilizando o retorno igual consta na documentação de vocês (nginx):

rewrite ^(.)$ /webhook;

porém, pelo fato de estarmos usando Laravel (versão 4.2), o que funcionou foi o retorno:

try_files $uri $uri/ /index.php?$query_string;

Ficando então:

location ^~ /gerencianet/webhook {
if ($ssl_client_verify != SUCCESS) {
return 403;
}

try_files $uri $uri/ /index.php?$query_string;
}

Avatar discord do usuario luizotavio5072

luizotavio5072

Ver Respostas

Boa tarde pessoal. Eu não consegui atualizar meu servidor de produção porque ele está dando um problema de disco cheio em /boot. Mas eu configurei um SSL no meu servidor de homologação e lá o nodejs está atualizado e deu certo. Então acredito que esse problema seja sim a versão do nodejs. No meu servidor de produção a versão do node é V9.4.0 e em homologação é V13.14.0. Então fica de feedback caso haja com outros usuários esse problema.

Avatar discord do usuario wesleykovalski

wesleykovalski

private function send(string $method, string $resource, array $request = [])
{
// ENDPOINT COMPLETO
$endpoint = $this->baseUrl . $resource;

// HEADERS
$headers = [
'Cache-Control: no-cache',
'Content-type: application/json',
'Authorization: Bearer ' . $this->getAccessToken()
];

// CONFIGURAÇÃO DO CURL
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $endpoint,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_SSLCERT => $this->certificate,
CURLOPT_SSLCERTPASSWD => '',
CURLOPT_HTTPHEADER => $headers
]);

switch ($method) {
case 'POST':
case 'PUT':
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($request));
break;
}

// EXECUTA O CURL
$response = curl_exec($curl);
curl_close($curl);

// RETORNA O ARRAY DA RESPOSTA
return json_decode($response, true);
}

Avatar discord do usuario wesleykovalski

wesleykovalski

Segue o código:

// ENDPOINT COMPLETO
$endpoint = $this->baseUrl . '/oauth/token';

// HEADERS
$headers = [
'Content-type: application/json',
'x-skip-mtls-checking: true'
];

// CORPO DA REQUISIÇÃO
$request = [
'grant_type' => 'client_credentials',
'webhookUrl' => 'https://www.dominio.com.br/endpointdowebhook'
];


// CONFIGURAÇÃO DO CURL
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $endpoint,
CURLOPT_USERPWD => $this->clientId . ':' . $this->clientSecret,
CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => json_encode($request),
CURLOPT_SSLCERT => $this->certificate,
CURLOPT_SSLCERTPASSWD => '',
CURLOPT_HTTPHEADER => $headers
]);

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

js
const express = require("express");
const fs = require("fs");
const https = require("https");
const bodyParser = require("body-parser");
var logger = require('morgan');

const httpsOptions = {
cert: fs.readFileSync(""), // Certificado fullchain do SSL do dominio
key: fs.readFileSync("/"), // Chave privada do SSL do domínio
ca: fs.readFileSync(""), // Certificado público da Gerencianet. Baixe aqui: https://pix.gerencianet.com.br/webhooks/chain-pix-prod.crt
minVersion: "TLSv1.2",
requestCert: true,
rejectUnauthorized: false, //Mantenha como false para que os demais endpoints da API não rejeitem requisições sem MTLS
};

const app = express();
const httpsServer = https.createServer(httpsOptions, app);
const PORT = 443;

app.use(logger('dev')); // Comente essa linha caso não queira que seja exibido o log do servidor no seu console
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// Endpoint para configuração do webhook, você precisa cadastrar https://SEUDOMINIO.com/webhook
app.post("/webhook", (request, response) => {
// Verifica se a requisição que chegou nesse endpoint foi autorizada
if (request.socket.authorized) {
response.status(200).end();
} else {
response.status(401).end();
}
});

// Endpoind para recepção do webhook tratando o /pix
app.post("/webhook/pix", (request, response) => {
if (request.socket.authorized){
//Seu código tratando a callback
/ EXEMPLO:
var body = request.body;
filePath = __dirname + "/data.json";
fs.appendFile(filePath, JSON.stringify(body) + "\n", function (err) {
if (err) {
console.log(err);
} else {
response.status(200).end();
}
})
/
response.status(200).end();
}else{
response.status(401).end();
}
});

httpsServer.listen(PORT, () =>
console.log(Express server currently running on port ${PORT})
);

Avatar discord do usuario rubenskuhl

rubenskuhl

Ver Respostas

Se você tiver como configurar isso, seu servidor está com TLS 1.0 e TLS 1.1 habilitados, e não deveria:
https://www.ssllabs.com/ssltest/analyze.html?d=cardapioo%2dapi.herokuapp.com&s=54.146.248.82&latest

Isso não deve ter relação com o problema em questão, mas é uma vulnerabilidade de segurança.

Avatar discord do usuario beto.hostoo

beto.hostoo

Ver Respostas

apache


ServerName pix.minhaempresa.com
ServerAdmin [email protected]

DocumentRoot /var/www/html/api/current/public


Options -Indexes +FollowSymLinks
AllowOverride all
Require all granted


ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/pix.minhaempresa.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pix.minhaempresa.com/privkey.pem
SSLVerifyClient require
SSLVerifyDepth 3
SSLProtocol -all +TLSv1.2
SSLCACertificateFile /etc/ssl/certs/chain-pix-prod.crt


SSLOptions +StdEnvVars


SSLOptions +StdEnvVars




Avatar discord do usuario rubenskuhl

rubenskuhl

Ver Respostas

Como é o resultado do SSL Labs para o domínio no cenário SSL Verify Client None ?

Avatar discord do usuario beto.hostoo

beto.hostoo

Ver Respostas

sim.. o certificado SSL está ok

Avatar discord do usuario rubenskuhl

rubenskuhl

Ver Respostas

Com SSLVerifyClient none, você consegue estabelecer uma sessão https com um browser ?

Avatar discord do usuario beto.hostoo

beto.hostoo

Ver Respostas

quando mudo o SSLVerifyClient require para none, o erro que a API da gerencianet retorna é que nao posso usar a rota pq nao tem mTLS.. quando ativo, dá o erro 403 dizendo que não faz o hand-shake =/

Avatar discord do usuario beto.hostoo

beto.hostoo

Ver Respostas

e a configuração do Apache está assim:

apache
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live//fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live//privkey.pem
SSLVerifyClient require
SSLVerifyDepth 3
SSLProtocol -all +TLSv1.2
SSLCACertificateFile /etc/ssl/certs/chain-pix-prod.crt

Avatar discord do usuario wesleykovalski

wesleykovalski

Ver Respostas

Essa configuração para definir parâmetros de SSL no apache, é feito direto no htaccess ?

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Boa tarde, <@!276372269893287936>! De acordo com o domínio que me passou, realmente estas configurações no Virtual Host fez não estão surtindo efeito...
No apache por exemplo, não é necessário informar o CA da Gerencianet (certificado .crt), nem o caminho para os certificado do seu SSL no VirtualHost 80, isto será somente no VirtualHost 443

Avatar discord do usuario smookeydev.cb

smookeydev.cb

Ver Respostas

Boa noite pessoal, estou implementando o PIX em uma aplicação, porém estou tendo problema com a configuração do webhook. Alguem poderia me ajudar?

Meu dominio usa a cloudflare para certificação SSL e usamos nginx para proxy reverso, eu recebo o request em /api/payments/pix/webhook/ e redireciono para o micro serviço dessa forma:

location /api/payments/pix/webhook/ {
proxy_pass http://localhost:5001/api/payments/pix/webhook
}

Tentei implementar a verificação no nginx dessa forma e não funcionou:
ssl_client_certificate /root/chain-pix-webhooks-sandbox.crt;
ssl_verify_client optional;
ssl_verify_depth 3;

location /api/payments/pix/webhook/ {
if ($ssl_client_verify != SUCCESS) {
return 403;
}
proxy_pass http://localhost:5001/api/payments/pix/webhook
}

Ao tirar o if ele me retorna:

{
"nome": "webhook_invalido",
"mensagem": "A autenticação de TLS mútuo não está configurada na URL informada"
}

Tentei implementar o SSL e o certificado da gerencianet direto no micro serviço do webhook e também não funcionou, o webhook é feito em Flask, alguem consegue me dar uma luz?

Avatar discord do usuario b1n._

b1n._

Ver Respostas

Pessoal continuo com problema pra configurar meu servidor pra cadastrar o webhook..
Conseguimos mudar o erro adicionando

SSLProtocol -all +TLSv1.2
na config do apache, mas ainda sem sucesso o webhook
acessar pelo browser acusa
ERR_BAD_SSL_CLIENT_AUTH_CERT
o erro que era 403 agora ta
{
"nome": "webhook_invalido",
"mensagem": "A URL informada respondeu com o código HTTP 301"
}

imagem enviada na mensagem pelo usuario b1n._

Avatar discord do usuario matwbug

matwbug

Alguém consegue me ajudar aqui com a api pix? por algum motivo minha requisição curl nao está dando response no site da gerencianet, até baixei os proprios códigos da doc e mesmo assim não foi, é como se a requisição não fosse feita, estou utilizando php


$config = [
"certificado" => BASE.'data/certif/gerencianet.pem',
"client_id" => "xx",
"client_secret" => "xx"
];
$autorizacao = base64_encode($config["client_id"] . ":" . $config["client_secret"]);

$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => "https://api-pix-h.gerencianet.com.br/oauth/token", // Rota base, homologação ou produção
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => '{"grant_type": "client_credentials"}',
CURLOPT_SSLCERT => $config["certificado"], // Caminho do certificado
CURLOPT_SSLCERTPASSWD => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Basic $autorizacao",
"Content-Type: application/json"
),
));

$response = curl_exec($curl);

curl_close($curl);

echo "
";
echo $response;
echo "
";
?>