Acabei de implementar isso usando o cliente desidratado com a validação dns01. O gancho dns01 é certzure porque nosso DNS está hospedado no Azure.
Editar: quando eu falo sobre chaves privadas, obviamente eu sempre digo que você só transforma as partes da chave pública em alfinetes. As chaves privadas, como o nome sugere, devem sempre permanecerem privadas. Veja meu próprio gancho para detalhes de implementação.
Você precisa de substituição de chave privada para tornar isso possível. Ou seja, você sempre tem a chave privada atual (chame de A) e a chave privada futura (chame de B), para que você possa adicioná-las aos seus pinos. Então, neste ponto, seus pinos são A e B. Quando chega o dia da renovação do certificado, a chave privada A se torna obsoleta e B torna-se ativo. Ao mesmo tempo em que você recebe uma nova chave privada futura, chame-a de C. Você regenera sua lista de alfinetes de modo que agora ela contém B e C. Então é assim que você passa suas chaves privadas. desidratado suporta isso agora .
Além disso, você precisa de um gancho que é chamado toda vez que renovar seus certificados e, assim, passar as chaves privadas. Implementei este sozinho .
Finalmente, se eu acertar, você precisa ter certeza de que:
HPKP age x 2 < days between cert renewals
Por exemplo, se sua idade de HPKP for de 50 dias e você renovar certs a cada 30 dias, um cliente que visitou seu site no primeiro dia ficará preso às chaves privadas A e B e rolou para B e C no dia 31. Seu servidor tem B e C, o cliente tem A e B, há uma correspondência mesmo no dia 50 e o cliente abre o site corretamente.
MAS, vamos ver se a idade do HPKP é de 70 dias. Você renova certs a cada 30 dias, e o cliente visitou seu site no primeiro dia, então, novamente, ele tem apenas as chaves privadas A e B. Você rolou para B e C no dia 31 e rolou para C e D no dia 61 Seu servidor tem C e D, o cliente tem A e B, não há correspondência e o cliente recebe o dedo do meio do dia 61 até o dia 71, quando a política do HPKP expira.
Outra opção, provavelmente mais segura e certamente muito mais simples, é usar a mesma chave privada toda vez e gerar uma ou várias chaves privadas de backup, e então codificá-las em sua configuração do HPKP e concluir o processo.
Sim, é complicado e pode haver advertências que eu não pensei, mas vamos ver a longo prazo. Obviamente, eu o implantei em um subdomínio acrítico com a idade de HPKP curta (15 dias) para que ele não cause grandes problemas.
Editar: eu escrevi alguns scripts para ajudar você a configurar o HPKP com o Let's Encrypt e desidratado usando o Nginx:
HPKPinx