LetsEncryptで公開キーピンを使用できますか?


回答:


12

最初に注意すべきいくつかの言葉:

  • HPKPの実装を計画している場合は、何をしているのかを把握してください。
  • あなたがそれを正しく行わない場合、または「悪いことが起こった場合」、それらはあなたの制御下にない場合、あなたのドメインを使用不可能にするかもしれません。
  • それほど重要ではないドメイン、またはたとえば10秒などの非常に短いキャッシュ時間で設定をテストしてください。
  • どの証明書をピン留めしたいかを考えてください:ルート、中間、リーフ...
  • 別の(バックアップ)認証局をピン留めすることが理にかなっている場合、それは中間証明書とリーフ証明書です。
  • 申し訳ありませんが安全です:別のバックアップCA /証明書を2つ用意しておくことが理にかなっている場合を考えてください。
  • これらのポイントと質問が「新しい」と聞こえる場合:これを実装する前に、HPKPの概要と一般的なトラップと警告をお読みください。

LetsEncryptで公開キーピンを使用できますか?

  • はい。

証明書が更新されると、公開キーピンも更新されますか?

  • これは、参照している証明書と固定している証明書によって異なります。

9

gf_が言ったすべてをエコーし​​ます。

しかし、質問に答えるために、はい、できます。

デフォルトでは、Let's Encryptは更新時にキーと証明書を再作成します。これにより、リーフでピン留めしたい場合にHPKPの実装が困難になります。これは、中間の変更(2016年3月に行われたように)に備えて行う必要があるでしょう。

HPKPを実行したい場合は、このためのいくつかのオプションがあります。

  1. リーフキーが変更されないように毎回CSRを作成する標準クライアントではなく、独自の固定CSRを使用します。このブログの投稿では、作成者がHPKPを使用しているため、この方法を具体的に説明します。
  2. 短いHPKPの有効期限を使用し、有効期限内に更新し、ポリシーを変更して、実際に証明書を変更する前に古いキーと新しいキーの両方を取得します。
  3. リーフや証明書ではなく、Let's Encryptルートを固定します。

1
良い追加、+ 1。
gf_

ルートを固定しても安全ですか?MITMの場合、自分のLet's Encrypt証明書を使用するのは本当に簡単です。
メルビック2016

2
攻撃者がLet's Encryptを使用してドメイン名の証明書を取得するのは「本当に簡単」ですか?それを行う方法を知らない。しかし、それは可能で可能すべての彼らは、ドメインの検証手順のバグを持っている場合、CA。LEルートをピン留めすることで、世界中のすべてのCAとは対照的に、攻撃対象領域を単にLet's Encryptに大幅に削減しました。まだピン留めの葉ほど安全ではありませんが、それはそれ自体のリスクをもたらすため、「安全」の定義に依存します。
Barry Pollard、2016

私がHPKPに大規模なリスクがあると私が思うと言って-主に自殺の観点から-それでファンではありません。CAを変更するか、証明書パスを変更する(SHA-256の減価などによる)か、緊急に証明書を再発行する必要があるか、バックアップキーが危険にさらされた/失われた、または設定者が去って次の人が気付かない場合彼らはHPKPを使用するか、またはそれについて知らない。HPKPは、Superfishな​​どのローカルのルートからも保護しません。したがって、ほとんどのサイトでは、HPKPは複雑すぎて、IMHOは、追加のセキュリティを少し追加するだけで保護を追加する価値はありません。しかし、それは私の意見です。
Barry Pollard、2016

OK、私が尋ねたのは、すべてのLE証明書が同じルート証明書を持っていると思っていたからです。したがって、ルートを別のLE証明書で他の誰かにピン留めすると、MITMを使用して、それ自体の証明書を偽ることができます。分かりますか?
メルビック2016

5

私は、これを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を使用して脱水するのに役立つスクリプトをいくつか書きました:

HPKPinx


3
私は両方の長所を持つことを決めました。自動秘密鍵のロールオーバー+静的秘密鍵。誰か興味があれば、ブログ記事を書くかもしれません。
bviktor 2017年

1
これを行う場合は、投稿を編集してリンクを挿入してください-ありがとう!
gf_ 2017年

おかげで、私はこれを今週または来週に仕上げるために全力を尽くします
bviktor 2017年

2
リンクを追加しました。ドキュメントはまだ不十分ですが、コードを試してハックできるようになっています。
bviktor 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.