回答:
最初に注意すべきいくつかの言葉:
LetsEncryptで公開キーピンを使用できますか?
証明書が更新されると、公開キーピンも更新されますか?
gf_が言ったすべてをエコーします。
しかし、質問に答えるために、はい、できます。
デフォルトでは、Let's Encryptは更新時にキーと証明書を再作成します。これにより、リーフでピン留めしたい場合にHPKPの実装が困難になります。これは、中間の変更(2016年3月に行われたように)に備えて行う必要があるでしょう。
HPKPを実行したい場合は、このためのいくつかのオプションがあります。
私は、これをdns01検証を備えた脱水クライアントを使用して実装しました。DNSがAzureでホストされているため、dns01フックはcertzureです。
編集:私が秘密鍵について話すとき、明らかに私は常にあなたが公開鍵の部分だけをピンに変えることを常に意味します。名前が示すように、秘密鍵は常に秘密にしておく必要があります。実装の詳細については、自分のフックを参照してください。
これを可能にするには、秘密鍵のロールオーバーが必要です。つまり、現在の秘密鍵(Aと呼びます)と将来の秘密鍵(B と呼びます)は常に手元にあるため、両方をピンに追加できます。したがって、この時点でピンはAとBです。証明書の更新の日になると、秘密キーAは廃止され、Bが有効になります。同時に、新しい将来の秘密キーを取得します。これをCと呼びます。ピンリストを再生成して、BとCが含まれるようにします。これで、秘密キーがロールオーバーされます。脱水はこれを今サポートします。
また、証明書を更新するたびに呼び出されるフックが必要なので、秘密鍵をロールオーバーします。これを自分で実装しました。
最後に、私がこれを正しく行う場合は、次のことを確認する必要があります。
HPKP age x 2 < days between cert renewals
たとえば、HPKPの年齢が50日で、証明書を30日ごとに更新した場合、1日目にサイトにアクセスしたクライアントは秘密鍵AとBでスタックし、31日目にBとCにロールオーバーします。サーバーにはBとCがあり、クライアントにはAとBがあります。50日目でも一致し、クライアントはサイトを正しく開きます。
しかし、HPKPの年齢が70日かどうかを確認しましょう。30日ごとに証明書を更新し、クライアントは1日目にサイトにアクセスしたため、秘密鍵AとBしかありません。31日目にBとCにロールオーバーし、61日目にCとDにロールオーバーしました。サーバーにはCとDがあり、クライアントにはAとBがあります。一致はなく、クライアントには、HPKPポリシーが期限切れになる61日から71日まで中指が与えられます。
別の、おそらくより安全な、そして確かにはるかに単純なオプションは、毎回同じ秘密鍵を使用し、1つまたは複数のバックアップ秘密鍵を生成し、それらをHPKP構成にハードコーディングして実行することです。
ええ、それはトリッキーで、私が考えていなかった警告があるかもしれませんが、長期的に見ていきます。明らかに、HPKPの有効期間が短い(15日間)の重要でないサブドメインに展開したので、大きな問題は発生しません。
編集:Let's Encryptを使用してHPKPを設定し、Nginxを使用して脱水するのに役立つスクリプトをいくつか書きました: