file-certificatePinagem do SSL

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.

Para gerar o pin da chave pública:

            openssl s_client -servername example.com -connect example.com:443 < /dev/null | \
            openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | \
            openssl dgst -sha256 -binary | openssl enc -base64 

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.

Para gerar o pin do certificado:

            openssl s_client -servername example.com -connect example.com:443 < /dev/null | \
            openssl x509 -outform DER | openssl dgst -sha256 -binary | openssl enc -base64   

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.

Atualizado