Histórico de mensagens sobre Skip-mTLS em pix

EXIBINDO CONVERSAS RECENTES:

Texto: Skip-mTLS
Canal: pix
Avatar discord do usuario rubenskuhl

rubenskuhl

Ver Respostas

Sim, se você não passou o x-skip-mtls-check, deveria falhar na configuração do webhook.
O que você pode consultar que pode trazer uma luz é o log do litespeed...

Avatar discord do usuario alissonmaciel_32335

alissonmaciel_32335

Meu Webhook: public function webhook() {
$body = '{
"webhookUrl": "https://julioerp.agenciaweblab.com.br/webhook.php"
}';
try {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->config['rotas'] . '/v2/webhook/' . $this->config['chave_pix']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_SSLCERT, $this->config["certificado"]);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '');
$headers = array();
$headers[] = 'Authorization: Basic ' . $this->access_token;
$headers[] = 'X-Skip-Mtls-Checking: true';
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);

echo '

';
var_dump($this->config['chave_pix'], $this->config['client_id'], $this->config['client_secret'], $result);
echo '
';

if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
return $result;
} catch (Exception $e) {
echo '
';
var_dump($e->getCode(), $e->getFile(), $e->getMessage());
echo '
';
}
}

Avatar discord do usuario alissonmaciel_32335

alissonmaciel_32335

Ver Respostas

Estou executando este método:
public function webhook() {
$body = '{
"webhookUrl": "https://julioerp.agenciaweblab.com.br/webhook.php"
}';
try {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->config['rotas'] . '/v2/webhook/' . $this->config['chave_pix']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_SSLCERT, $this->config["certificado"]);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '');
$headers = array();
$headers[] = 'Authorization: Bearer ' . $this->access_token;
$headers[] = 'X-Skip-Mtls-Checking: true';
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);

echo '

';
var_dump($this->config['chave_pix'], $result);
echo '
';

if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
return $result;
} catch (Exception $e) {
echo '
';
var_dump($e->getCode(), $e->getFile(), $e->getMessage());
echo '
';
}
}

Avatar discord do usuario geisonderrico

geisonderrico

Olá pessoal, boa noite. Tudo bem ?

Estamos tentando fazer a implementação do Webhook usando o Skip-mTLS. Fiz o cadastro da chave usando o atributo x-skip-mtls-checking como true, para poder testar.

A chave foi cadastrada com sucesso.

Porém, eu vi que o arquivo de exemplo pra tratar as respostas via WebHooks funciona apenas com mTLS. Como funciona no caso do skip ligado ?

Avatar discord do usuario thiagorobles

thiagorobles

Ver Respostas

fiz a alteração abaixo, adicionei o cert e a key que baixei no momento da criação da aplicação

private instance = axios.create({
httpsAgent: new https.Agent({
cert: Buffer.from(process.env.EFI_CERT, 'base64'),
key: Buffer.from(process.env.EFI_KEY, 'base64'),
ca: Buffer.from(process.env.CHAIN_PIX_PROD_CRT_BASE64, 'base64'),
requestCert: true,
rejectUnauthorized: true,
}),
headers: {
'x-skip-mtls-checking': true,
},
});

Agora o erro que recebo é unable to get local issuer certificate

parece ser algo relacionado ao SSL, porem está configurado corretamente pelo ACM do heroku

essas variaveis de ambiente estao configuradas pelo heroku, fiz o encode para base64, loguei o resultado do Buffer.from, e está logando os certificados corretamente (cert, key e ca)

Avatar discord do usuario thiagorobles

thiagorobles

Ver Respostas

@rubenskuhl obrigado pelo retorno, eu tentei integrar no meu Controller (uso nestjs) na minha API que está no heroku, aqui está o código:

import {
ClassSerializerInterceptor,
Controller,
HttpCode,
HttpStatus,
Logger,
Post,
Req,
UseInterceptors,
} from '@nestjs/common';
import { LoggerInterceptor } from '@src/common/logger/logger-interceptor';
import configuration from '@src/config/configuration';
import axios from 'axios';
import { Request } from 'express';
import as https from 'https';

const { httpsOptions } = configuration();
@Controller('efi-gerencianet')
@UseInterceptors(ClassSerializerInterceptor, LoggerInterceptor)
export class EfiGerencianetController {
private readonly logger = new Logger(EfiGerencianetController.name);

private instance = axios.create({
httpsAgent: new https.Agent({
ca: httpsOptions.ca,
requestCert: true,
rejectUnauthorized: true,
}),
headers: {
'x-skip-mtls-checking': true,
},
});

@Post('webhook/pix')
@HttpCode(HttpStatus.OK)
handlePixCallback(@Req() req: Request) {
const body = req.body;

this.logger.log(Received callback from Gerencianet);
this.logger.debug(body);
return body;
}

@Post('configure-webhook')
async configureWebhook() {
const url =
'https://api-pix.gerencianet.com.br/v2/webhook/4114c4e9-202c-4979-8534-34a4e5a29ad0';
const data = {
webhookUrl: '',
};

try {
const response = await this.instance.put(url, data);
this.logger.log(
Webhook configured successfully. Status code: ${response.status},
);
return response.data;
} catch (error) {
this.logger.error(Error configuring webhook: ${error.message});
throw new Error(Error configuring webhook: ${error.message});
}
}
}


subi pra produção, e ao chamar o endpoint recebo o erro: Error: Error configuring webhook: read ECONNRESET

Para SSL estou usando o heroku ACM (auto managed).


Sabem o que posso estar fazendo errado?

Avatar discord do usuario diogo.f.m.7

diogo.f.m.7

Ver Respostas

Eu agr concordo com o @rubenskuhl, mas acho q a EFI vai ter muitoooo problema com esse skip-mtls...

Ontem tivemos um debate bem interessante, hoje vi q a EFI se exime de culpa, mas no final, se der BO, eles vão acabar punidos pelo BC... Em hlg terno Skip ok, mas em prod abre margem para problemas...

Maaaaaasssss, como isso é Brasil, da msm forma q tem N PSPs com api fora do padrão, e eu diria que vai continuar assim .. nada vai acontecer...

Avatar discord do usuario f1ed7e55d61c2f1af0ae4a2814_43203

f1ed7e55d61c2f1af0ae4a2814_43203

Ver Respostas

Como que vai verificar o certificado, se o skip-mtls vai estar ativado? 🤔

Avatar discord do usuario f1ed7e55d61c2f1af0ae4a2814_43203

f1ed7e55d61c2f1af0ae4a2814_43203

Parâmetro ".headers['x-skip-mtls-checking']", deve ser igual a um dos valores predefinidos

Alguém saberia me dizer como resolver isso?
imagem enviada na mensagem pelo usuario f1ed7e55d61c2f1af0ae4a2814_43203

Avatar discord do usuario rubenskuhl

rubenskuhl

Ver Respostas

Troque para skip-mtls-check. Essa opção não desliga o mTLS, desliga a verificação que eles fazem.

Avatar discord do usuario diogo.f.m.7

diogo.f.m.7

Ver Respostas

Mas eu deixei bem claro a minha pergunta... "Posso utilizar do skip-mtls em produção?"

Avatar discord do usuario diogo.f.m.7

diogo.f.m.7

@igor_efi @elaine2983, podem dar uma orientação sobre esse assunto?? Em produção, usando hospedagem compartilhada, posso usar o skip-mtls, e validar o webhook pelo IP de origem??

Avatar discord do usuario diogo.f.m.7

diogo.f.m.7

Ver Respostas

Não não, só olhar a doc deles... Eles deixam bem claro que em hospedagem compartilhada pode usar o skip-mtls, e fazer a validação do webhook via IP de origem da request...

Avatar discord do usuario diogo.f.m.7

diogo.f.m.7

Ver Respostas

Na vdd, o skip-mtls pode ser usado em produção tbm....

Avatar discord do usuario rubenskuhl

rubenskuhl

Ver Respostas

Sim, mas para usar o de homologação pode-se o usar o x-skip-mtls-checking

Avatar discord do usuario .thomasjackson

.thomasjackson

public async Task SaveWebhookUrl(Guid chavePix, string webhoookUrl)
{
dynamic efi = new EfiPay(
appSettings.Payment.ClientId,
appSettings.Payment.ClientSecret,
appSettings.Payment.Sandbox,
appSettings.Payment.Certificate
);

var headers = "{\"x-skip-mtls-checking\": \"true\"}";

var param = new
{
chave = chavePix.ToString()
};

var body = new
{
webhookUrl = webhoookUrl
};
var result = Task.FromResult(efi.PixConfigWebhook(param, body, headers));
await Task.FromResult(efi.PixConfigWebhook(param, body, headers));
}

Avatar discord do usuario .thomasjackson

.thomasjackson

Ver Respostas

ok, eu fiz essa implementacao
public async Task SaveWebhookUrl(Guid chavePix, string webhoookUrl)
{
dynamic efi = new EfiPay(
appSettings.Payment.ClientId,
appSettings.Payment.ClientSecret,
appSettings.Payment.Sandbox,
appSettings.Payment.Certificate
);

var headers = "{\"x-skip-mtls-checking\": \"true\"}";

var param = new
{
chave = chavePix.ToString()
};

var body = new
{
webhookUrl = webhoookUrl
};

await Task.FromResult(efi.PixConfigWebhook(param, body, headers));
}

Avatar discord do usuario .thomasjackson

.thomasjackson

Ver Respostas

Bom dia Joao, fiz um cadastro de webhookUlr em homolog mas a api retornou 401 nao autorizado.
Estou usando .net e adicionei o header conforme no github um parametro x-skip-mtls-checking: true
Esta correto o que eu fiz ?

Avatar discord do usuario viniciusfebasse_37973

viniciusfebasse_37973

Ver Respostas

@joaolucas_efi e @diogo.f.m.7
Estou recebendo as notificações, mas o POST está vindo vazio

Request.POST:

Sabem o que pode ser?

Configurei o webhook com x-skip-mtls-checking = true

Avatar discord do usuario guilherme_efi

guilherme_efi

Ver Respostas

Além de criar um servidor na OCI, durante os testes você pode utilizar a opção skip-mtls e registrar uma URL do https://webhook.site/, por exemplo.