RESTful サービスでユーザーを識別できる必要があります。クライアント証明書認証で HTTPS を使用することにしました。これにより、他のサービスがユーザーまたはパスワードを URL、ヘッダー、またはその他の方法で安全に渡すことができるようになります。
ここで、サービスに送り返すデータを暗号化したいと考えています。たとえば、プレーンなユーザー ID を送信する代わりに、自分のサーバー キーで暗号化して送り返すだけです。その後、サービスはこの (暗号化された) データを送信し、ローカルで復号化できるようになります。
この暗号化には、サービスから提示された SSL 証明書を使用したいと考えています。
私のサーバーにある証明書には、秘密鍵と公開鍵の両方が含まれていると思います。したがって、サーバー側の証明書の公開鍵を使用してデータを暗号化し、サーバー側の秘密鍵で安全に復号化できることを確認できます。サーバー側の証明書の公開鍵しか持たないため、サードパーティのサービスはデータを復号化できません。
ここで質問 - クライアント (HTTPS) からの X509Certificate 形式のクライアント SSL 証明書が与えられた場合、ローカル キーストアで対応する証明書を見つけるにはどうすればよいですか? その証明書の形式と、そこから秘密鍵/公開鍵を取得する方法は何ですか?
基本的なフローをUPDします。
- サービスは REST アプリにリクエストを送信します: http://rest.api.com/authenticate/username/password/
- REST アプリが応答を返します: { ok: "123456" }
- サービスは REST アプリにリクエストを送信します: http://rest.api.com/1233456/dosomething
- REST アプリは 123456 を抽出し、操作に使用する必要があるユーザーを認識します
手に入れたいもの
- サービスは REST アプリにリクエストを送信します: http://rest.api.com/authenticate/username/password/
- REST アプリはユーザー名/パスワードを取得し、データベースでユーザー ID を見つけます
- REST アプリは ID をサービスと共有したくない
- REST アプリは、サービスの SSL 証明書を認識しています
- REST アプリは、そのサービスへの受信トラフィックを暗号化するために使用される、対応する公開鍵を見つけます。
- REST アプリは ID "123456" を REST アプリの公開鍵で暗号化し、応答を送信します: { ok : "lybibHubJis7" }
- サービスは REST アプリにリクエストを送信します: http://rest.api.com/lybibHubJis7/dosomething
- REST アプリは、SSL キーチェーンの秘密鍵を使用して文字列 lybibHubJis7 を復号化し、ユーザー ID が 123456 であることがわかり、このユーザーで操作を実行します。