bacen / pix-api

API Pix: a API do Arranjo de Pagamentos Instantâneos Brasileiro, Pix, criado pelo Banco Central do Brasil.
https://bacen.github.io/pix-api
2.36k stars 268 forks source link

[Dúvida] - mTLS no consumo da API PIX e no recebimento de webhooks #350

Closed filipehcds closed 2 years ago

filipehcds commented 3 years ago

Boa tarde pessoal,

Conseguem me ajudar com 3 dúvidas relacionadas a mTLS? Eu já li praticamente todas as issues falando de mTLS mas mesmo assim não consegui solucionar minhas dúvidas devido ao meu conhecimento limitado de segurança.

1ª Dúvida - Eu (usuário recebedor) estou me integrando a um PSP Recebedor para consumi da API PIX deles, referente à conexão mTLS, eu gerei uma .CSR na minha máquina e enviei ao PSP Recebedor, eles assinaram com a CA deles e me devolveram o Certificado, estou acessando a API PIX deles informando o clientId/clientSecret/certificadoPublico/chavePrivada, até ai tudo bem, a integração já está em fase final, entretanto, o PSP Recebedor me informou agora que esse processo de eu ter gerado o arquivo .CSR esta incorreto e me solicitaram um Certificado já assinado por uma CA amplamente reconhecida para eles cadastrarem no Gateway deles, primeira dúvida, esse processo que eu havia feito de ter gerado a .CSR e enviado pra eles assinarem, está incorreto? Caso esteja incorreto, eu preciso comprar um certificado de uma CA exclusivamente para efetivar essa integração?

2ª Dúvida - Para receber os webhooks do PSP Recebedor, eu havia informado á eles que o processo seria igual o onboarding que fiz com eles, eles deveriam nos enviar uma .CSR para assinarmos com a nossa CA e emitirmos o certificado para eles, mas eles estão informando que esse processo está incorreto e nos enviaram um certificado já assinado por uma CA reconhecida para adicionarmos na truste store e começar a identificar eles por esse certificado, ambos os modelos estão corretos ou só esse último informado por eles?

3ª Dúvida - Eu li na documentação que é possível utilizar o mesmo certificado utilizado para conectar na API PIX para receber os webhooks, como isso é tecnicamente possível? Pois ao meu ver (nível básico++ de conhecimento em segurança) para consumir a API PIX eu precisaria ter em meu poder a chave privada, e enviaria somente a chave publica para o PSP Recebedor, como o PSP Receber vai conseguir usar esse mesmo certificado para fazer o processo inverso se ele não possui a chave privada em seu poder?

Desculpe pelo "nível" das perguntas, mas estou quebrando bastante a cabeça com isso.

Obrigado

rubenskuhl commented 3 years ago

1a. dúvida - O manual de iniciação prevê tanto um modelo com CSR e CA interna do PSP quanto CA de mercado. É escolha do PSP suportar um, outro ou ambos; se ele te informou errado, considere isso como má prestação de serviços e procure outro PSP em #76. Há CAs reconhecidas que são gratuitas como a https://letsencrypt.org , então isso não necessariamente significa desembolso, apesar de exigir algum trabalho em horas-pessoa. 2a. dúvida - idem anterior. 3a. dúvida - Em mTLS as duas partes mostram um certificado. Isso é possível usando o mesmo par chave pública/chave privada ora como iniciador ora como atendedor.

filipehcds commented 3 years ago

Obrigado pelas informações @rubenskuhl Consegue me ajudar com outra duvida por favor? Eu como usuário recebedor, fiz meu onboarding no PSP Recebedor enviando uma .CSR que havia gerado na minha máquina e eles assinaram e me devolveram o .CRT, até ai tudo certo, já estava me integrando com eles, mas eles estão me falando que agora esse fluxo mudou e eu preciso enviar um certificado pra eles de uma AC amplamente conhecida e não mais um auto assinado, qual certificado eu preciso comprar? É um private SSL? Pergunto isso porque no CName eu colocaria uma URL "fake" que não existe, visto que é uma conexão Client Certificate e não existe URL exposta em nenhum servidor, sabe me dizer qual o tipo de certificado eu preciso comprar?

rubenskuhl commented 3 years ago

Obrigado pelas informações @rubenskuhl Consegue me ajudar com outra duvida por favor? Eu como usuário recebedor, fiz meu onboarding no PSP Recebedor enviando uma .CSR que havia gerado na minha máquina e eles assinaram e me devolveram o .CRT, até ai tudo certo, já estava me integrando com eles, mas eles estão me falando que agora esse fluxo mudou e eu preciso enviar um certificado pra eles de uma AC amplamente conhecida e não mais um auto assinado, qual certificado eu preciso comprar? É um private SSL? Pergunto isso porque no CName eu colocaria uma URL "fake" que não existe, visto que é uma conexão Client Certificate e não existe URL exposta em nenhum servidor, sabe me dizer qual o tipo de certificado eu preciso comprar?

Isso é algo que seu PSP precisa te contar, sobre o que ele aceita... o que eu acho mais razoável é que seja um certificado DV de um domínio do qual sua empresa seja titular e que isso possa ser verificável (um registry/registrar que permita consulta do titular do domínio pelo PSP).

filipehcds commented 3 years ago

Isso é algo que seu PSP precisa te contar, sobre o que ele aceita... o que eu acho mais razoável é que seja um certificado DV de um domínio do qual sua empresa seja titular e que isso possa ser verificável (um registry/registrar que permita consulta do titular do domínio pelo PSP).

Eles informaram que precisam de um certificado assinado por uma CA publica mas não informaram quais os procedimentos para conseguirmos solicitar, não estamos conseguindo solicitar porque estão nos informando que o CName precisa ser de uma URL que a CA consiga validar se é nossa, mas esse certificado seria para ser utilizado pelo nosso back-end, então não temos URL válida pra geração de certificado, @rubenskuhl sabe me dizer se existe algum tipo de certificado onde eu não preciso validar a URL do CName? Utilizar por exemplo "CN: qualquercoisa.{empresa}.com.br" mas sendo que é uma URL ficticia?

rubenskuhl commented 3 years ago

Isso é algo que seu PSP precisa te contar, sobre o que ele aceita... o que eu acho mais razoável é que seja um certificado DV de um domínio do qual sua empresa seja titular e que isso possa ser verificável (um registry/registrar que permita consulta do titular do domínio pelo PSP).

Eles informaram que precisam de um certificado assinado por uma CA publica mas não informaram quais os procedimentos para conseguirmos solicitar, não estamos conseguindo solicitar porque estão nos informando que o CName precisa ser de uma URL que a CA consiga validar se é nossa, mas esse certificado seria para ser utilizado pelo nosso back-end, então não temos URL válida pra geração de certificado, @rubenskuhl sabe me dizer se existe algum tipo de certificado onde eu não preciso validar a URL do CName? Utilizar por exemplo "CN: qualquercoisa.{empresa}.com.br" mas sendo que é uma URL ficticia?

Existem os certificados wildcard que se aplicam a *.exemplo.com.br, mas acho overkill pedir isso. Se eles não informam, pegue um certificado gratuito da Let's Encrypt e veja o que eles respondem.

filipehcds commented 3 years ago

Existem os certificados wildcard que se aplicam a *.exemplo.com.br, mas acho overkill pedir isso. Se eles não informam, pegue um certificado gratuito da Let's Encrypt e veja o que eles respondem.

Ai que tá, pra usar o Let's Encrypt preciso demonstrar também o "controle do meu dominio", sendo que na integração não tem dominio envolvido, seria meu back-end Java conectando no PSP Recebedor direto via mTLS, e o que preciso pra isso é um .CRT (Chave Publica) e um .KEY (Chave Privada), alguma ideia? @rubenskuhl

rubenskuhl commented 3 years ago

Existem os certificados wildcard que se aplicam a *.exemplo.com.br, mas acho overkill pedir isso. Se eles não informam, pegue um certificado gratuito da Let's Encrypt e veja o que eles respondem.

Ai que tá, pra usar o Let's Encrypt preciso demonstrar também o "controle do meu dominio", sendo que na integração não tem dominio envolvido, seria meu back-end Java conectando no PSP Recebedor direto via mTLS, e o que preciso pra isso é um .CRT (Chave Publica) e um .KEY (Chave Privada), alguma ideia? @rubenskuhl

O domínio no modelo que propus é apenas uma forma indireta de provar que se trata da mesma empresa. Mas como já disse, é como eu faria se eu fosse um PSP... como faz o seu, só o seu pode dizer.

renatofrota commented 3 years ago

Tem uma coisa crucial sendo completamente ignorada aqui: mTLS é uma autenticação mútua e a requisição feita pelo PSP ao EC é através de uma URL (obrigatoriamente válida - publicamente acessível - e com HTTPS). Por isso, é certo que você precisa de uma URL (de fato) e um certificado válido para ela ou não conseguirá receber os callbacks (com mTLS).

Se você não está falando de recebimentos de notificações no seu URL de webhook (os chamados callbacks) mas exclusivamente de consumo da API (para criar cobranças, consultar Pix, etc), o certificado a ser utilizado é, normalmente, criado e fornecido pelo PSP e não pelo EC. O conjunto de fatores de autenticação da API é:

  1. Client_ID
  2. Client_Secret
  3. Certificado para consumo da API (normalmente fornecido pelo PSP)

O PSP pode, opcionalmente, aceitar outros certificados. E se eles fazem questão que seja emitido por CA reconhecida (e não autoassinado), você pode usar um certificado qualquer (como um criado para consumo-api-pix.seudominio.com.br, emitido pela Let's Encrypt, e utilizado em N integrações diferentes suas e de clientes seus).

O único problema, no caso desses certificados emitidos pela Let's Encrypt, é que eles tem validade de 90 dias. Se o seu PSP não for leniente em relação à validade do certificado (continuar aceitando após vencido) você precisará atualizar no seu sistema o certificado utilizado para consumo a cada 61-85 dias (intervalo de praxe do mercado para certificados de 90 dias de validade).

rubenskuhl commented 3 years ago

O BACEN impede que certificados auto-assinados pelo EC sejam aceitos pelo PSP; é proibido no manual de iniciação. O PSP pode ou ter uma CA própria, e certificar os ECs por ela, ou aceitar CAs de mercado.

thiagolvlsantos commented 2 years ago

Dúvida aparentemente esclarecida.

Atenciosamente, Thiago Santos.