HPKP é um cabeçalho de resposta de segurança da Web obsoleto, a sigla significa HTTP Public Key Pins. O objetivo era evitar que uma autoridade de certificação comprometida ou desonesta emita um certificado HTTPS publicamente confiável, mas controlado por hacker, para um site. Nesse cenário, os hackers seriam capazes de descriptografar qualquer tráfego HTTPS interceptado para o site afetado.
Dica: Os cabeçalhos de resposta da Web são pedaços de metadados que o servidor inclui ao responder às solicitações. Um pequeno subconjunto deles é conhecido como cabeçalhos de segurança, pois eles habilitam e configuram vários recursos de segurança.
Infraestrutura de certificado HTTPS
A infraestrutura de certificado na qual o HTTPS é construído é baseada em uma rede de confiança. Várias empresas atuam como autoridades de certificação (CA) que publicam um ou mais certificados raiz. Um conjunto de certificados raiz está incluído em todos os dispositivos em um armazenamento confiável. Quando um site solicita um certificado HTTPS próprio de uma CA, o certificado é assinado por um certificado raiz. Quando seu computador vê um certificado HTTPS, ele verifica a assinatura. Se o certificado for assinado por um certificado raiz em que ele confia, o seu computador também confia no certificado HTTPS.
Dica: Uma CA também pode ter certificados intermediários assinados pelo certificado raiz. Esses certificados intermediários também podem ser usados para assinar certificados HTTPS para sites.
O trabalho de uma autoridade de certificação é apenas emitir um certificado quando ela tiver verificado que a pessoa que o solicita é o proprietário genuíno do site. A ideia com essa estrutura é que, se um hacker criar seu próprio certificado para um site, ele não será assinado por uma CA em que seu computador confia e, portanto, você verá um aviso.
O que HPKP fez?
Todo o sistema de certificação depende da confiabilidade das autoridades de certificação. Originalmente, no entanto, não havia proteções contra o comprometimento de uma CA por hackers ou se tornasse desonesta e optasse por emitir certificados incorretamente.
HPKP foi projetado para ser uma proteção contra essa possibilidade. Ele permite que os sites especifiquem uma lista exclusiva de certificados que podem ser confiáveis para o site em um processo denominado pinning. Era possível fixar o certificado raiz ou intermediário, essencialmente permitindo que uma única CA emita certificados para o site. Também foi possível fixar o certificado do próprio site, impedindo até mesmo a CA certa de emitir outro certificado válido.
Tecnicamente, não é o próprio certificado que é fixado, mas um hash da chave do certificado. Um hash é uma função criptográfica unilateral. Isso significa que é possível verificar se o certificado apresentado ao navegador pelo site corresponde a um certificado fixado, mas não é possível usar o hash para fazer um certificado válido.
O HPKP exigia que pelo menos duas chaves fossem fixadas, pelo menos uma delas deve ser um backup e não na cadeia de certificados atual. Este backup permite que você configure uma transferência suave para um novo certificado que não impede que os usuários se conectem.
Se o certificado HTTPS apresentado ao navegador pelo site não corresponder a um dos certificados fixados, o navegador será obrigado a rejeitá-lo e evitar que o usuário ignore a mensagem de erro do certificado.
Estrutura de HPKP
O cabeçalho HPKP possui três partes obrigatórias e duas opcionais. O cabeçalho deve ser intitulado “Public-Key-Pins”, os próximos dois ou mais certificados precisam ter um hash SHA256 codificado em base64 fixado no formato 'pin-sha256 = ””'. A parte final obrigatória é a “idade máxima”, que é uma contagem em segundos por quanto tempo o navegador deve aplicar as restrições.
Dica: SHA256 é o algoritmo de hash usado pelo HPKP. Base64 é um conjunto de caracteres com 64 caracteres: 0-9, az, AZ e os caracteres especiais “+” e “/”. O “=” é usado para preencher até os dois últimos caracteres, se necessário.
As configurações opcionais são “includeSubDomains” e “report-uri”. “IncludeSubDomains instrui o navegador a aplicar as proteções HPKP a qualquer subdomínio do site atual durante o cronômetro de“ idade máxima ”. “Report-uri” é um recurso que permite que um site seja especificado para onde os relatórios de erros podem ser enviados e é projetado para ajudar a identificar e resolver problemas.
Há uma segunda variante do cabeçalho intitulada “Public-Key-Pins-Report-Only”. Tudo é igual, porém, se um erro for encontrado, nenhuma ação é tomada além de retornar uma mensagem de erro ao navegador e ao “uri-relatório” se houver um configurado. A variante do relatório apenas foi projetada para permitir o teste em escala real do cabeçalho antes da implantação, onde os erros não causariam problemas para os usuários.
Problemas com HPKP
HPKP foi preterido por dois motivos principais. O cabeçalho poderia causar problemas sérios para o site que o usava de duas maneiras: HPKP Suicide e Ransom PKP.
HPKP Suicide é um problema em que os proprietários legítimos do site perdem o acesso a todas as chaves fixadas. Isso pode acontecer por meio de exclusão acidental, hacking, vírus, corrupção de dados ou por muitos outros motivos. Devido à complexidade da implementação correta do HPKP e, principalmente, de mantê-lo atualizado durante a rotação de certificados, é relativamente fácil cometer um erro de configuração. Com o HPKP, no entanto, se você errar, todos os visitantes recentes do seu site serão impedidos de acessar o seu site durante o cronômetro de “idade máxima”. O site smashingmagazine.com postou um artigo detalhando sua experiência exatamente com esse problema, o que basicamente deixou o site offline para a maioria dos visitantes por quatro dias antes de uma correção ser implantada.
Ransom PKP é um ataque teórico em que um hacker obtém acesso a um servidor da web, rouba todos os certificados e chaves confiáveis e exige um resgate pela sua devolução. Em uma configuração normal, você poderia apenas gerar novas chaves e certificados e ter o site de volta em funcionamento em menos de uma hora. Com o HPKP habilitado, no entanto, essas chaves são fixadas; se você não puder fornecer um certificado fixado aos usuários, eles não poderão acessar o site durante o temporizador de “idade máxima”. Dependendo da configuração e se houver backups, pode ser impossível resolver esse problema.
Com esses dois problemas, novos usuários seriam capazes de acessar o site normalmente, já que nunca teriam visto o antigo cabeçalho HPKP instruindo seu navegador a confiar apenas nos certificados ausentes. Todos os visitantes recentes, no entanto, como clientes regulares e leitores, teriam que esperar por toda a duração do cronômetro de “idade máxima”.
Dada a gravidade desses problemas e a complexidade da configuração e manutenção, o uso do cabeçalho HPKP era muito baixo. Eventualmente, os principais navegadores concordaram em retirar totalmente o suporte para ele e, em alguns anos, o cabeçalho HPKP foi universalmente descontinuado.