Como implementar a fixação de chaves públicas com relatórios HPKP

Emily Stark

Usar o SSL no seu site é uma maneira importante de preservar a segurança e a privacidade dos seus usuários. Mas ativar o SSL não é o fim da história. Há muitas etapas que você pode seguir para melhorar ainda mais a segurança que seu site oferece, desde configurar o atributo Secure nos seus cookies até ativar o HTTP Strict Transport Security ou usar a Política de Segurança de Conteúdo para bloquear os privilégios do seu site. No entanto, implantar esses recursos avançados às vezes pode ser complicado. Para ajudar você a implementar uma forma mais rigorosa de SSL, o Chrome 46 inclui um recurso chamado HPKP reporting.

O que todas essas siglas significam?

Atualmente, a segurança na Web depende de certificados SSL: assinaturas criptográficas que comprovam a identidade de um site. Quando seu navegador envia uma solicitação para um URL como https://developers.google.com, o servidor fornece um certificado SSL e, se o certificado for válido, o navegador permitirá que a solicitação prossiga e mostre o URL do site com um cadeado verde na barra de endereço.

Mas o que é um certificado válido? Para ser considerado válido, um certificado precisa ser assinado por uma autoridade de certificação (CA, na sigla em inglês) ou por outro certificado assinado por uma CA (conhecida como CA intermediária). Os navegadores e sistemas operacionais vêm com uma lista de centenas de CAs confiáveis para emitir certificados. No entanto, o problema é que, por padrão, qualquer uma dessas CAs pode emitir certificados para qualquer site. Se alguma delas estiver comprometida ou com comportamento inadequado, isso pode ser devastador para toda a Web.

Insira o fixação de chaves públicas HTTP, ou HPKP. Esse padrão permite que os sites enviem um cabeçalho HTTP que instrui o navegador a lembrar (ou "fixar") partes da cadeia de certificados SSL. O navegador recusará conexões subsequentes que não corresponderem aos PINs recebidos anteriormente. Veja um exemplo de cabeçalho HPKP:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

Este cabeçalho especifica dois hashes de certificado como alfinetes. Um deles é o hash de um certificado na cadeia de certificados do site, e o outro é um PIN de backup ou um hash de um certificado que o site pode usar caso precise alternar o certificado. O cabeçalho também inclui um valor max-age. Após esse número de segundos, o navegador vai esquecer o PIN.

Para saber mais sobre o HPKP em geral, confira a especificação ou a excelente postagem do blog feita por um desenvolvedor do Chrome, Chris Palmer.

Devo ligar o HPKP agora?

Não necessariamente. Quando você implanta o HPKP, é muito fácil cometer um erro e causar DoS acidentalmente em seu site. Se você fixar seu site em um conjunto de certificados e tiver que implantar um novo, os usuários que viram o alfinete não poderão acessar o site até que o alfinete expire (com base no valor de max-age no cabeçalho).

Como é complicado acertar, o HPKP é usado principalmente por alguns sites importantes e que exigem segurança no momento. Ao ativar o HPKP, comece com um valor max-age bem curto e aumente gradualmente se não houver problemas.

O que são relatórios de HPKP e como eles ajudam?

O recurso de geração de relatórios HPKP, incluído no Chrome 46, pode ser usado para detectar configurações incorretas durante o lançamento do HPKP.

Primeiro, você pode começar enviando o cabeçalho Public-Key-Pins-Report-Only em vez do cabeçalho Public-Key-Pins:

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

Quando seu site envia esse tipo de cabeçalho, o Chrome verifica se a conexão atual corresponde aos alfinetes e envia um relatório para o report-uri, caso contrário. O Google Chrome nunca bloqueará solicitações com base nos alfinetes em um cabeçalho "Somente relatório". Portanto, essa é uma maneira segura de testar o HPKP e ver se ele causa problemas para os usuários sem correr o risco de criar um DoS para seu site.

Observe que um cabeçalho "Somente relatório" só se aplica à solicitação em que é recebido. O navegador não se lembra dos alfinetes somente para relatórios como ocorre com os alfinetes reais. Isso permite que você teste sua configuração sem se preocupar com o armazenamento em cache de valores inválidos nos navegadores dos usuários e pode lançar de forma incremental (por exemplo, apenas em um único recurso) para evitar sobrecarregar seu servidor com relatórios.

Ao implementar o cabeçalho Public-Key-Pins real para começar a aplicar os alfinetes, você também pode incluir um valor de report-uri nesse cabeçalho, para que continue a receber relatórios se ocorrer algum problema.

O que é incluído em uma denúncia de violação de HPKP?

Um relatório de violação de HPKP é uma mensagem JSON enviada em uma solicitação HTTP POST para o report-uri configurado. A lista de campos pode ser encontrada na spec, mas vou destacar dois deles aqui: served-certificate-chain e validated-certificate-chain. O served-certificate-chain é o certificado exatamente como o Chrome o recebeu ao configurar a conexão SSL para a solicitação. O validated-certificate-chain, por outro lado, é a cadeia que o Chrome reconstruiu ao tentar validar o certificado do servidor, que, surpreendentemente, pode ser diferente do served-certificate-chain. Clientes diferentes executam a validação de certificados de maneiras diferentes, e essa pode ser uma causa comum de configurações incorretas do HPKP. Verifique esse campo se estiver recebendo relatórios inesperados.

Uma última mensagem

Se você estiver implantando relatórios HPKP, lembre-se de que o Chrome fixa todas as solicitações, incluindo solicitações de envio de relatórios. Então, se você implantou o HPKP no seu site, provavelmente quer enviar os relatórios dele para um domínio diferente que não foi fixado. Caso contrário, uma violação de PIN no seu site aciona uma denúncia para o mesmo domínio, o que também gera uma reprovação.

Se você não tiver outro domínio à mão, tente usar um serviço como o report-uri.io, que lida com relatórios de violação para você.