Histórico de mensagens sobre mtls

EXIBINDO CONVERSAS RECENTES:

Texto: mtls
# pix
Avatar discord do usuario anoni_mato

anoni_mato

Ver Respostas

como vc tá dando skip no mtls, é pra funcionar (vc está assumindo o risco de um request de notificação forjado)

# pix
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
]);

# pix
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})
);

# pix
Avatar discord do usuario rubenskuhl

rubenskuhl

Ver Respostas

Se é compartilhado, sugiro ver as mensagens de hoje sobre o mtls.pix.ae do @anoni_mato...

# pix
Avatar discord do usuario anoni_mato

anoni_mato

Ver Respostas

E corrigindo essa minha mensagem: eu não sou muito familiarizado com Node, mas parece que tem como, sim, validar o certificado da GN usando Node, de acordo com a documentação da GN no link abaixo (tem uma aba "Node" com código de exemplo). Mas não sei se isso é possível num ambiente controlado por terceiros como a Heroku. Em todo caso, o mtls.pix.ae permanecerá sempre gratuito. Boas almas como o <@!535222756837556244> ajudam a financiar 💟

https://dev.gerencianet.com.br/docs/api-pix-endpoints#section-exemplos-de-configura-es-de-servidor

# pix
Avatar discord do usuario anoni_mato

anoni_mato

Ver Respostas

a menos que vc configure diretamente no seu virtualhost a validação do certificado da GN, você não tem como saber lá no Node se o request veio com o certificado ou não. é aí que entra o mtls.pix.ae. ele se encarrega de rejeitar os requests sem o certificado da GN

# pix
Avatar discord do usuario anoni_mato

anoni_mato

usando o mtls.pix.ae o primeiro será respondido com 403 por não ter a chave da GN (não vai nem chegar até você). você só vai receber o segundo (que deve ser respondido com http status 200)

# pix
Avatar discord do usuario inbox5372

inbox5372

E o mesmo comportamento qdo eu prefixo com mtls.pix.ae

# pix
Avatar discord do usuario anoni_mato

anoni_mato

estranho. faz o mesmo teste cadastrando https://cardapio-api.herokuapp.com/ (sem o mtls.pix.ae). você deve receber o primeiro request de confirmação - que deveria ser respondido pelo seu servidor/app com 403 por não ter o certificado da GN para vc verificar. confere se vem com o append /pix

# pix
Avatar discord do usuario anoni_mato

anoni_mato

Ver Respostas

resumidamente, o proxy mtls.pix.ae "derruba" a necessidade de você se preocupar com mtls. se quiser uma garantia de o request entrante é da GN, você tem alternativas:

1- enviar um request de consumo na API Pix da GN pra constatar a informação recebida;

2- anotar o IP usado pelo pix.ae nos requests que recebe e depois validar se estão vindo sempre desse mesmo IP;

3- usar uma rota com uma string aleatória menos previsível do que "/webhookpix" (e não torná-la pública).

# pix
Avatar discord do usuario anoni_mato

anoni_mato

não precisa retornar nada. a resposta http padrão é 200. só se você responder algo diferente (mandar um header 503 por ex), o mtls.pix.ae vai repassar o mesmo status (pra indicar que eles precisam retentar a notificação mais tarde), por exemplo

# pix
Avatar discord do usuario anoni_mato

anoni_mato

é um "proxy transparente". o mtls.pix.ae responde "em seu nome" para a GN, como se o domínio mtls.pix.ae fosse seu mesmo

# pix
Avatar discord do usuario anoni_mato

anoni_mato

Ver Respostas

essa etapa 3 eu acho que não está bem descrita. o mtls.pix.ae não faz redirecionamento. ele vai repassar o request vindo da GN para https://cardapio-api.herokuapp.com/webhookpix/pix (lembre-se que a GN adiciona /pix no callback, conforme documentação do BACEN).

# pix
Avatar discord do usuario anoni_mato

anoni_mato

Ver Respostas

o proxy mtls não tem docs pq é basicamente só prefixar seu URL de notificação com mtls.pix.ae

# pix
Avatar discord do usuario anoni_mato

anoni_mato

como se não houvesse a exigência do mTLS

# pix
Avatar discord do usuario anoni_mato

anoni_mato

Ver Respostas

correto, no request enviado com o certificado, vai passar pro seu servidor. o que o seu servidor responder, o mtls.pix.ae devolve pra GN

# pix
Avatar discord do usuario anoni_mato

anoni_mato

Ver Respostas

o proprio mtls.pix.ae vai responder com 403 se o certificado da GN não for validado

# pix
Avatar discord do usuario tryvin_

tryvin_

Ai a comunicação entre o mtls.pix.ae e o seu servidor recomendo que mande algum secret para confirmar que veio do local certo