web-dev-qa-db-ja.com

SSL証明書を使用したアプリケーション間の安全な通信

アプリケーション間の通信を保護する方法を探しています。一部のTCP=ポートでリッスンしている「サーバー」アプリケーションと「サーバー」と通信している「クライアント」アプリケーションがあります。両方のアプリケーションは実際にいくつかのサーバーにインストールされています。複数の負荷が存在する可能性があります-これらのアプリケーションのバランスの取れたインスタンス。

「サーバー」が通信が「クライアント」アプリケーションからのものであることを確実に確認できるように、SSL証明書の使用は正しい方法ですか?どのように機能しますか?すべてのアプリケーションに独自の証明書が必要ですか?証明書はどこに保存されますか?同様のソリューションが議論されているリソースがあれば、私はそれを感謝します。

17
bretik

This.joshからの回答が好きですが、追加したい点がいくつかありました。

  • TLSは、チャネルの保護に証明書を使用しません。これは、ネゴシエートされた対称キーによって行われます。 TLSは、証明書(サーバーまたはクライアント)の認証と鍵の暗号化を使用します。
  • 暗号化に使用される証明書は、認証に使用される証明書と同じであってはならないことに同意します。ただし、この場合、TLSに使用される証明書は、暗号化ではなく認証に使用されると言っても安全だと思います。掘り下げると、証明書でキー暗号化が行われていることは事実であり、ハイエンドシステムを入手すると、これについて私に反対する人がいることになると確信していますが、やりすぎのように、多くのユースケースでTLSの上にチャレンジ/レスポンスプロトコルを通過します。
  • 前の回答で暗示されていましたが、私はそれを空白にしたと言います-デフォルトのTLSは通常サーバー認証のみです。クライアント認証を取得するには、そのためのスイッチをオンにする必要があり、その過程で次を指定します:
    • クライアント認証に適切な資格情報-デジタル証明書など.
    • 資格情報を確認する方法-たとえば、証明書に署名した信頼できる認証局に対して確認し、OCSPまたはCRLソースに対して証明書のステータスを確認します-これはPKIの全領域であり、このスタックを掘り下げると思います交換については、こちらをご覧ください。

一般に、クライアントとサーバーの両方で提供された証明書のすべての要素を確認することは、このチャネルに接続しているエンティティが、それがそうであると主張するエンティティであることを保証するための最良の方法です。典型的なメカニズムは次のとおりです。

  • 信頼された署名者-証明書は通常、認証局(CA)によって署名されます。その認証局は信頼されており、証明書を発行する前に要求者を確認します。信頼の必要性が広く分散しているほとんどのシステムは、一連のCAを信頼して資格情報を発行します。エンドエンティティが表示されたときに、承認されたCAの1つが証明書に署名したことを確認できるように、CA証明書のセットを手元に置いてこれを行います。
  • ステータス-CAが証明書に署名すると、ステータスを最新に保つ責任も負います-これは、OCSPを介してレンダリングされる場合とされない場合があるCRL(証明書失効リスト)を発行することによって行われます(a呼び出し/応答プロトコル)。次に、エンドポイントは、証明書を受け取ったときに、証明書のステータスを確認して、発行元のCAに従って証明書がまだ有効であることを確認します。
  • 自己署名証明書-証明書がCAによって署名されていない場合は、自己署名されます。これは非常に安価な方法ですが、構成が負担になります。自己署名入りの証明書はそれ自体の良さを表明するため、検証者は各証明書のコピーを手元に置いて、各自己署名入りの証明書を個別に手動で信頼する必要があります。安価で、非常に小規模なインストールの場合は十分ですが、非常に小規模です。
  • 有効性-すべての場合において、証明書は開始日から終了日まで有効であり、現在の有効性を確認するために確認する必要があります。

認証v。承認

Authentication-それが言うエンティティは本当ですか?これは、資格情報が有効な身元証明である限り当てはまります。私が16歳であっても、運転免許証は私の居住国から適切に発行されたものであれば有効です。ただし、酒類によって許可されているわけではありません(米国に住んでいる場合、少なくとも21歳でなければなりません)。

Authorizationエンティティは、やりたいことを実行できますか? 21歳以上であれば酒を購入することができます。技術的には21歳以上で十分ですが、運転免許証、パスポート、または州発行のIDを認証することで証明できます。

両方が必要なようです。あなたは、それぞれの側がそのアイデンティティを証明し(認証)、特定の制限付きグループ(会社によって作成された)である必要があります。したがって、TLSクライアント認証だけでなく、承認を確認するための基準をチェックする追加の方法が必要です。

私はそれに取り組むいくつかの方法を考えることができます:

  • 信頼できるユーザーのリストを設定する-PKIを使用する場合、一般的な方法は、各クライアントまたはサーバーのサブジェクトDN(識別名)のリストです。スケーラビリティは、このリストを保存する場所に直接関連しています。つまり、LDAPサーバーのようなパブリックストアは、すべてのサーバーが共通の場所を確認できるようにするのに適しています。

  • 証明書に品質があることを確認します-DNの組織の価値が頭に浮かびます-これは通常、エンティティが由来する組織を説明する値です。たとえば、私の個人のデジタル証明書では、会社がそれらを取得するために支払ったので、会社の名前が "O"値になります。次に、いくつかの追加コードを作成して(または非常にスマートなサーバーでは、構成するだけです...)、「O =your company "-そして、あなたは大丈夫です-あなたの会社の名前が" O "の値で他の誰もが証明書を作成できないことを保証できる限り。そのための1つの方法は、そのCAプロバイダーとの契約とアカウントを設定し、社内に指定された承認担当者が事務処理を行う、上位の商用証明機関の一部です。その人は、CAが証明書を作成する前に、証明書の各要求が会社からのものであることを証明します。独自のCAを実行して同じことを行うことができます-基本的に、時間とお金のトレードオフです。

警告:ここでは多くの詳細を説明しています。 「安全性の高い」認証と承認の管理方法とそれらの管理方法を理解することは、常勤の仕事です。実際、それは業界全体です。ここで取り上げているのは、最低限の努力の草の根の概念です。何百万、何十億ドルもの企業の投資、または人間の生命、あるいは私たちが知っている世界の状態を保護するために何かをまとめていると私に言った場合-私はオフラインで私に連絡するように言って、私はこの問題をあなたの手から取り除くことができる便利な賢い人々の素敵なチーム...有料で。どんなシステムも最も弱いリンクと同じくらい強いだけなので、このものをチェックすることに関するすべての通信と手順は慎重に処理する必要があるので、エリア全体がかなり速く鶏と卵のシナリオになります。私がここで投げているのは、あなたが巨大なものを何も持っていないことを前提としています、あなたはほとんどほんの少しの保護を必要とする新しいシステムに取り組んでいます-あなたの家の周りにニースゲートを投げるのと同等です。門ではなく、番犬、防犯カメラ、スパイクされたクラブを持つ大きな男ではありません。 :)

現在...キーストレージ

キーストレージには2つの主要な要素があります。

  • 攻撃からどれくらい安全でなければなりませんか?
  • どのようにアクセスする必要がありますか?

「安全」は、多くの場合、FIPSコンプライアンスレベルで評価されます。これは、キーストレージメカニズムをテストする方法であり、エスカレートするセキュリティ要件の特定のセットを満たします。ローエンドはソフトウェアストレージです。キーは1つを使用します商業的にサポートされているいくつかのストレージメカニズムの1つであり、ハードドライブに搭載されています(価格=無料、またはハードドライブのわずかなメモリの価格)。ハイエンドは大きくて高価なボックス(HSM-ハードウェアセキュリティモジュール)です。誰も箱から鍵を取り出せないような方法であなたの鍵を保持します...いつまでも...そして彼らがしようとすると、彼らがあまりにも頑張ると、箱は自分自身を消滅させ、鍵を消去します。の間に。

どれだけの安全性を支払いたいかは、完全にリスク/コストの決定です。何を失う必要があるか、何を支払うかを計算する必要があります。

「アクセス方法」にはいくつかの要素があります。

  • ソフトウェアキーはボックス上で簡単にアクセスできます。それらを格納するための商業的にサポートされている方法がいくつかあり、ほとんどのサーバーはほとんどのストレージメカニズムをサポートしています。 PKCS12とJKSは2つの例です。
  • ハードウェアキーは通常、PKCS 11プロトコルによってアクセスされます(他にもあります)。ほとんどのハイエンドサーバーにはこれが組み込まれていますが、これを処理するための拡張機能やカスタムビルドコードのAPIが必要になる場合があります。また、鶏/卵の問題があります。通常、HSMにアクセスするにはパスワードが必要です。そのパスワードをどこにどのように保存するかは、セキュリティのもう1つの領域です。
  • クライアントにとっては、モビリティの問題もあります。 「クライアント」が固定点である場合-サーバーと同じHW/SWオプションがありますが、「クライアント」が人間を意味する場合は、ユーザーの移動性とGUIメカニズムとの互換性(たとえば、ブラウザ)。それはまだHW/SWに要約されますが、多くの場合、HW要素は「トークン」と呼ばれます。これは、削除機能が重要な機能になるためです。

すべての場合において、証明書はどこにでも保存できます。これらは、広範囲に配布できる公開情報です。重要な要素は秘密鍵です。秘密鍵は、それを使用するエンティティのみがアクセスできる場所に格納する必要があります。

単一の証明書を使用できるユーザー

それは、キーをどのように保存するか、そしてどのようなリスクを受け入れるかによって異なります。ネットワークアクセス可能なHSMのキーは、技術的にはサーバーのバンクで使用できます。これにより、すべてのサーバーを1つのサーバーのように見せることができます(Webアプリにはかなり便利です)。ただし、特定のアクションを実行したクライアントまたはサーバーを正確に証明する必要がある場合は、エンティティごとに1つの証明書が必要です。また、失効できるのは証明書のみです。つまり、キーストアが侵害されたと思われる場合に、1つだけ無効にできるレベルの分離が必要です。

一般的に、秘密鍵を複数の場所に配置していることに気付いた場合、それはチェックポイントです。これは重大なリスクであり、別の証明書を取得したいという優れた指標です。そこから、分離のレベルはIMOです。ほとんどの場合、追跡するレベルと、アクセスを制御するために必要なその他のニーズの問題です。

19
bethlakshmi

はい、おそらく使用します トランスポート層セキュリティ(TLS) Secure Sockets Layer(SSL)の代わりに使用します。これは、よく使用され、レビューされたネットワーク通信セキュリティだからです。証明書の部分は、公開/秘密鍵のペアと派生データの生成、配布、ユーザー、および廃棄を含む公開鍵インフラストラクチャです。

認証されたサーバーとのみ通信するクライアントアプリケーションのプロトタイプを作成しているようです。リモートサーバーの認証は、単に通信チャネルを保護することとは異なります。証明書を使用してサーバーを認証する場合でも同じ証明書を使用して通信チャネルを保護し、サーバーを認証することはできません

認証の1つの方法は、チャレンジレスポンスプロトコルです。一般的なチャレンジレスポンスプロトコルは Secure Remote Password(SRP) です。 SRPは多くの言語とプラットフォームでアクセスできます。

「すべてのアプリケーションに独自の証明書が必要ですか?」各クライアントを一意に認証する必要があるかどうかによって異なります。一意の認証が必要だと判断した場合は、キーイングの負担を理解する必要があります。必要なキーの数は、クライアントの数に直接比例します。 10人のクライアントにとってこれは負担にならないかもしれませんが、1万人にとっては困難です。

答える必要があります:

  • だれが鍵を生成しますか?
  • 誰が鍵に署名するか:CAを使用するか、独自のCAを作成しますか?
  • キーはどのように配布されますか?
  • キーはどのように無効化されますか?
  • キーの有効期間はどうなりますか?
  • 鍵の更新、回復、交換はどのように処理しますか?

「証明書はどこに保存されますか?」

ほとんどのオペレーティングシステムとプラットフォームでは、キーストレージメカニズムが組み込まれています。

  • Javaキーストア
  • Windows CryptoAPI
  • OpenSSLはPKCS 11および12を提供します
  • LinuxにはGPG、LUKS、dm-cryptなどがあります。
8
this.josh