私はPKIを概念的な観点から合理的によく理解しています-秘密鍵/公開鍵-それらの背後にある数学、証明書に署名するためのハッシュと暗号化の使用、トランザクションやドキュメントのデジタル署名など。 Cライブラリは、通信と認証を保護するために証明書とともに使用されました。また、opensslコマンドラインツールにも非常に精通しています。
ただし、WebベースのPKI対応プロジェクトの経験はほとんどないため、これをよりよく理解するために個人プロジェクトを設計およびコーディングしようとしています。
要求事項
これは銀行のウェブサイトです。すべてのインターネットバンキングユーザーは、いくつかの既知のCA(verisign、Thawte、entrustなど)によって発行された証明書を使用できます。銀行は、ユーザーの証明書を取得する責任を負いません。これらの証明書は、銀行のWebサイトへの認証に使用されます。プラットフォーム/ OSなどはまだ修正されていません。
設計
認証を行うための最良の方法は何だろうと思っていました。
Apacheには2方向SSLを有効にする方法があることがわかりました。この場合、Webサイトに移動すると、ユーザーに証明書を自動的に要求すると思います。しかし、証明書が信頼できるCAによって署名されているかどうか、および証明書の件名行のホワイトリストに含まれるかどうかを検証するだけであると思われるため、これで十分かどうかはわかりません。しかし、これは十分ではありません。 bankuseridを証明書に関連付ける必要があるため、銀行の場合。
IISには、Active Directoryの各ユーザーの証明書を保存する方法があるようです。これは、いくつかのMSDN記事を読んで理解したことです。IISで2方向SSLをオンにし、ユーザーがWebサイトに移動しようとすると、IISは承認されたCAのリストを使用してブラウザーに要求を送信し、ブラウザーはユーザーが証明書ストアから適切な証明書を選択して送信できるようにしますバックエンドに。IISは2つのことを行うと仮定しています
- ユーザーが証明書に対応する秘密キーを持っていることを確認します(カバーネゴシエーションにより)
- ADユーザー証明書マッピングに基づいて、IISはユーザー名をアプリケーションに報告します。
暗号化関数を呼び出すことで明示的に認証を行いますが、Webサーバーに依存することに依存します。
- 証明書をアップロードするユーザー画面を表示すると、アプリケーションは、ユーザーが証明書に対応する秘密鍵を持っていることを確認します(証明書を使用して文字列に署名するようフロントエンドに要求します)。
- アプリケーションにはいくつかのデータが保存されているデータベースがあり、各ユーザーを自分のユーザーIDにマッピングできます。これは
- 各ユーザーIDに対応する証明書全体
- 各ユーザーIDに対応するCAおよび証明書のシリアル番号。
よく使われる方法はどれだろうと思っていましたか?ベストプラクティスは何ですか?#3に進む必要がある場合、これを行う最良の方法は何ですか?
スマートフォンアプリでも簡単に機能するものは、追加のボーナスになります。
更新
「認証部分を自分でコーディングする」というステートメントを明確にしましょう。答えの一部は、それが誤解されていることを示しているようです。
これは、私が自分で暗号文を書くという意味ではありません。これは、IISや他のWebサーバーに暗黙的に依存する代わりに、実際に明示的に暗号化ルーチンを呼び出すことを意味します。