O SSL Pinning, ou Certificate Pinning, é uma técnica de segurança utilizada para garantir
que a aplicação estabeleça conexões seguras apenas com servidores previamente
autorizados, por meio da verificação do certificado digital ou da chave pública
apresentada durante a negociação SSL/TLS. Essa abordagem adiciona uma camada extra
de validação, independentemente da loja de certificados do sistema operacional,
reduzindo significativamente o risco de ataques do tipo Man-in-the-Middle (MITM),
mesmo em cenários onde certificados raiz falsos estejam instalados no dispositivo.
A pinagem de SSL assegura que somente a identidade criptográfica previamente
configurada seja aceita pela aplicação, inibindo a interceptação, análise ou modificação
das requisições trocadas com o backend e protegendo a confidencialidade e a integridade
dos dados transmitidos.
Mecanismo Técnico: Ao invés de confiar exclusivamente na cadeia de certificados do
sistema operacional, o MAD valida o certificado apresentado pelo servidor comparando
o com um ou mais pins criptográficos embutidos no aplicativo. Esses pins correspondem
a hashes previamente definidos e armazenados de forma segura, e a conexão é
considerada válida apenas quando ocorre a correspondência com pelo menos um dos
valores configurados.
Para configuração de Public Key Pinning, esta opção define as regras de pinagem para os
domínios especificados. O MAD suporta dois métodos de pinning, definidos pelo atributo
type no elemento <pin>
a. Public Key Pinning (type="publicKey")
Este é o método recomendado e padrão. Nesse modo, é fixado o hash do
Subject Public Key Info (SPKI) do certificado. Essa abordagem é mais
flexível, pois permite que o certificado expire e seja renovado sem a
necessidade de atualização do aplicativo, desde que o mesmo par de
chaves pública e privada seja mantido.
b. Certificate Pinning (type="certificate")
Nesse método, é fixado o hash do certificado digital completo. Trata-se de
uma abordagem mais restritiva, pois qualquer alteração no certificado,
incluindo renovações simples, exigirá a atualização do aplicativo para
evitar falhas de conexão.
A configuração do certificate pinning é realizada por meio do XML da aplicação. O modo
de operação pode ser definido como strict ou permissive. No modo strict, a conexão será
bloqueada caso nenhum pin válido corresponda. No modo permissive, as falhas de
pinagem são apenas reportadas, sendo indicado para testes ou ambientes controlados.
Cada host define regras específicas de pinagem para um domínio determinado. É possível
utilizar curingas, como *.example.com, para abranger subdomínios. Quando múltiplos
pins são configurados para um mesmo host, a conexão será considerada válida se pelo
menos um deles corresponder, permitindo estratégias seguras de rotação de certificados.
Exemplo de configuração:
<certificatePinning>
<!-- Habilita a funcionalidade de certificate pinning -->
<enabled>false</enabled>
<!--
O modo pode ser 'strict' ou 'permissive'.
- 'strict': A conexão só será bem-sucedida se pelo menos um pin coincidir. Isso significa que se
o host não estiver configurado ou o pin não coincidir, a conexão falhará.
- 'permissive': Apenas os hosts configurados aplicarão o certificate pinning.
-->
<mode>permissive</mode>
Nota: Os valores de pin devem ser informados em Base64, correspondentes ao hash SHA
-256 do certificado ou da chave pública.