2016-01-02 31 views
7

この質問は、クライアントアプリケーションでSSLピンニングをWeb APIと証明書 の有効期限に使用することに関するものです。SSLのピン設定と証明書の有効期限

シナリオ

私が所有してexample.comとなどAPIがホストされているサブドメイン、持っている:api.example.com

私が使用したいがapiをのSSLにすると、サブドメインのSSL証明書が作成されます。

証明書を取得した後、私が持っている:

  • A公開証明書
  • A中間証明書
  • プライベートキー

それは私がこれらの証明書をインストールすることを私の理解です私のウェブサーバー。

クライアントアプリケーションがapiに接続したいと考えています。中間者様式 の攻撃を軽減するために、私はSSLピンニングを使用したいので、クライアントは自分のapiと通信します。 誰かがそれを偽装するのではありません。

クライアントアプリケーションにピン接続するには、2つの選択肢があります。いずれかを公開するか、中間の 証明書を使用します。

私はこれを実装しています。

api.example.comの証明書が期限切れになるとどうなりますか?

クライアントアプリケーションが動作しなくなることは私の理解です。

パブリック/中間/プライベートアイテムの完全なセットを再度生成する必要がありますか? 新しい公開または中間証明書をアプリに入れますか?

質問

私はまだapi.example.com上の証明書が更新されるまで、クライアントアプリが仕事をしたいと思います。 もちろん、新しい証明書をクライアントアプリケーションに入れることができますが、ロールアウトなどの作業には時間がかかります。

どうすれば対応できますか?

私はGoogleが毎月自分の証明書を更新し、何とか同じ公開鍵を維持するために管理していることを読んだ:それが可能だ場合、その解決策は、単にサーバーから公開鍵を抽出することであるHow to pin the Public key of a certificate on iOS

とローカルに保存されている公開鍵と照合してください...しかし、Googleはどのようにしていますか?

おかげ

クリス

答えて

8

注:私は、サーバーへのブラウザのピニング(HTTP公開鍵ピンニング - HPKP)をよりよく知っているサーバーピニングにではなく、アプリが、私は校長が同じであると推定。 HPKPでは、サーバーによってHTTPヘッダーとして固定ポリシーが提供されていますが、HTTP応答から読み取るのではなく、アプリに組み込まれることがよくあることを理解してください。したがって、以下の点を念頭に置いてお答えください。

ピン止めは、通常、証明書ではなく、複数のレベルにすることができます。いくつかの選択肢があります:

  1. 新しい証明書を生成するために同じキー/ crtを再利用してください。あなたの証明書を更新するたびに新しい鍵を生成することをお勧めしますが、これはピンニングを使用すると複雑です。それで、ピンニングはキーの再利用のような貧弱なセキュリティ習慣を奨励しますか?

  2. 締め切りポリシーにいくつかのバックアップキーがあり、最も古いものを破棄して証明書を更新する際にそれらを回し、時間を忘れずに新しいものを追加してください。個人的に私は証明書の更新時に鍵を生成するのではなく、バックアップをいくつか用意しておくことをお勧めします。そして、あなたはいくつのバックアップを取るべきですか?例えば。あなたは、更新の前後に妥協のために証明書を再発行する必要がある場合は、また、それを台無しにする?だから2? 3? 100?

  3. ピンをさらに上にします。最初の中間またはルートCA証明書を言う。したがって、新しく発行された証明書はまだ信用されています(同じ証明書パスで発行されていることを前提としています)。これの欠点は4つあります。i)あなたはまだその固定された証明書によって発行された、それでも攻撃面は大幅に縮小されましたが、依然としていくつかの人々の心配がありました)、ii)複数の有効なパスが存在するため、クライアントがその中間証明書を使用することを保証することはできません。この2番目の方がはるかに大きな問題です。あなたは、中間証明書を提供することは、これが使用されることを保証すると思いますが、そうではありません(これのsha-1の例がたくさんあります)。 iii)同じ中間体またはルートで新しい証明書が発行される保証はありません(特に、技術がsha2の導入のように変化した場合)。この全選択肢は非スターターです。iv)同じ証明書プロバイダを使用することにつながります大したことではありませんが、私は自由な動きが好きです)。とにかくアプリがこの機能をネイティブにサポートしているのかどうかは確信していますが、ブラウザは確かにそうです。

  4. ポリシーキャッシュの有効期限が切れるまで、事前に更新して新しいキーを使用しないでください。たとえば、1年間の証明書と30日間のピン留めポリシーがある場合は、11か月後に更新し、新しいキーをポリシーに追加してから、30日間待って、誰もが新しいポリシーを取得するか、少なくとも古いポリシーが期限切れになり、キーと証明書を切り替えます。短期的な方針に依存していますが、古いポリシーの有効期限が切れた日から証明書提供者が事前に証明書を提供していない限り、少なくとも30日かかる可能性があります。アプリの場合、ピン止めポリシーがその中にハードコードされていると、更新をプッシュアウトするのにかかる時間がかかることがあります。

最終的に、certsは更新が必要なため、私はピンニングの大きなファンではありません。 であることを定期的に更新するとは思わない、半永久的に正しい答えです。そして、ちょうど私を震えさせるブラウザでは、プリロードポリシーの話もあります。

ピン設定では、不正なCAがドメインの証明書を発行していないことが保証されますが、実際にピンイングの手間と比較するとどの程度でしょうか?証明書の透明性のようなものや、たとえ実際にその攻撃を止めなくても、その問題に対するより良い解決策であるかもしれません。

最後にローカルにインストールされたルーツ(ウイルス対策スキャナや企業プロキシなど)は、(ブラウザ上で)少なくともピンチチェックをバイパスしてください。

ピンニングを使用する前に慎重に考えて、すべての結果を理解してください。

2

mozilla developer siteは、サーバー証明書に署名した中間CAの証明書を固定することを推奨しています。

"証明書の更新とローテーションを容易にするために、サーバ証明書を発行したCAの中間証明書にピンを配置することをお勧めします。あなたがImplementing and Testing HTTP Public Key Pinning (HPKP)

を参照することができ、ピン止め、公開鍵の実装とテストの詳細については

関連する問題