LetsEncrypt証明書を30日ごとに更新するようにcronjobを設定するときに、公開キーピンを設定できますか?
証明書が更新されると、公開キーピンも更新されますか?
最初に注意すべきいくつかの言葉:
LetsEncryptで公開キーピンを使用できますか?
証明書が更新されると、公開キーピンも更新されますか?
Gf_が言ったすべてをエコーします。
しかし、質問に答えるために、はい、できます。
デフォルトでは、Let's Encryptは更新時に鍵と証明書を再作成します。これにより、リーフでピン留めしたい場合にHPKPの実装が困難になります。これはおそらく、中間の変更の場合に行う必要があります( 2016年3月に行われたように )。
HPKPを実行したい場合は、このためのいくつかのオプションがあります。
私はこれを dehydrated クライアントを使用してdns01検証で実装しました。 DNSがAzureでホストされているため、dns01フックは certzure です。
編集:私が秘密鍵について話すとき、明らかに私は常にあなたが公開鍵の部分だけをピンに変えることを常に意味します。名前が示すように、秘密キーはalwaysを非公開のままにする必要があります。実装の詳細については、自分のフックを参照してください。
これを可能にするには、秘密鍵のロールオーバーが必要です。つまり、現在の秘密鍵(Aと呼びます)とfuture秘密鍵(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があり、一致はなく、クライアントには、61日目から71日目までのHPKPポリシーが期限切れになるまで中指が与えられます。
別の、おそらくより安全な、そして確かにはるかに単純なオプションは、毎回同じ秘密鍵を使用し、1つまたは複数のバックアップ秘密鍵を生成し、それらをHPKP構成にハードコーディングして実行することです。
ええ、それはトリッキーであり、私が考えていなかった警告があるかもしれませんが、長期的に見ていきます。明らかに私はそれを短い(15日)HPKP年齢の重要でないサブドメインに展開したので、大きなトラブルを引き起こしません。
編集:Let's Encryptを使用してHPKPを設定し、Nginxを使用して脱水するのに役立つスクリプトをいくつか書きました: