3

clientCertificateを読み取るASP.netサイトを開発して、スマートカードがWebサイトへのアクセスに使用されたことを確認しようとしています(ユーザー名/パスワードのログインを廃止しようとしています)。

私が考えているプロセスは次のとおりです。

  1. ユーザーがアカウントを登録し、C#がユーザーのclientCertificate(パブリック)を記録します。
  2. その後、ユーザーは同じclientCertificateを使用して次回ログインでき、ハッシュが有効な場合は認証されたユーザーになります。
  3. 証明書の信頼性を確保するために、以下のコードを使用します。ブラウザは秘密鍵を処理し、証明書が偽造されていないことを確認する必要があります。
  4. 件名と証明書の組み合わせに基づいて、C#はそれらに役割アクセスを割り当てます。

次のコードは、証明書の信頼性に使用できますか?

X509Certificate x509Cert = new X509Certificate(Request.ClientCertificate.Certificate);
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] hashvalue = sha.ComputeHash(Request.ClientCertificate.Certificate);
byte[] x509Hash = x509Cert.GetCertHash();
// compare x509Hash WITH hashvalue to ensure they are a match. 
// If not, possibly faked certificate, not a real smartcard???

これは、SmartCard認証プロセスが機能する方法ですか?

4

3 に答える 3

2

クライアント証明書を使用してユーザーを認証する必要がある場合は、IISでこれを行う必要があります。アプリケーションにコードを追加する必要はまったくありません。

クライアント証明書を使用するかどうかを指定する(IIS 7)

クライアント証明書をデータベースアカウントにリンクする必要がある場合、または追加の検証手順を実行する必要がある場合を除きます。ただし、クライアント証明書の認証については、IISの設定を使用します。

更新:クライアント証明書を操作する必要がある場合は、次のことができます。

X509Certificate2 x509Cert2 = new X509Certificate2(Page.Request.ClientCertificate.Certificate);

次に、次のようなプロパティにアクセスします。

x509Cert2.Subject

ただし、検証部分はIISに任せてください。クライアントが不正な証明書を提示した場合、IISがそれを拒否するため、asp.netコードは実行されません。

于 2012-04-20T15:38:38.980 に答える
2

このスレッドを参照してください、サー。コードで明示的に信頼性を検証する必要はありません。IISが自動的に行います。

IISはSSL証明書をチェックしますか、それとも検証する必要がありますか?

IISは失効リストをチェックしようとします(ただし、CRLが大きい場合、これは無効になることがよくあります)。OCSPレスポンダーを使用して、CRLが非常に大きい場合、またはCRLのチェックの待ち時間が長い場合に検証する必要がありますhttp://www.axway.com/products-solutions/email-identity-security/identity-security/va-suite

于 2012-04-20T15:33:48.453 に答える
1

クライアント証明書認証は、SSL/TLSハンドシェイク中に実行されます。

これは通常、公開鍵インフラストラクチャを使用して実行されます。これにより、サーバーには、クライアント証明書を検証するために使用する信頼できるCA証明書の(固定)リストがあります(サーバーのクライアントと同じ方法で)。この段階の後で証明書がアプリケーションに提示されると、次のことがわかります。

  • クライアントはその証明書の秘密鍵を持っています(TLSハンドケーキのCertificate Verifyメッセージによって保証されます(SSL / TLSスタックがこれを検証します。何も実装する必要はありません)。
  • クライアントは、信頼できるCAに対して検証されているため、証明書に記述されているIDを持っています。

信頼できるCAに対する検証では、ユーザーが事前にそのCAに登録されている必要があります。信頼できるCAによって発行されていない証明書を認証することはできません。(証明書のサブジェクトをローカルユーザーIDにマッピングすることは別の問題です。必要に応じて、最初の接続時にこれを行うことができます。たとえば、独自のデータベースまたはディレクトリサービスを使用して、サブジェクトDNをアプリケーション内の別の種類のユーザーIDにマッピングします。)

ユーザーがアカウントを登録し、C#がユーザーのclientCertificate(パブリック)を記録します。その後、ユーザーは同じclientCertificateを使用して次回ログインでき、ハッシュが有効な場合は認証されたユーザーになります。

必ずしも一般的に信頼されているCAに頼ることなく、証明書の提示を許可し、それを初期登録に使用したいようです。

これは原則として可能であり、JavaでのPKIの代替案を探すためにこれを行いました。

これを行うには、SSL / TLSハンドシェイクに関する限り、証明書を通過させ、後で証明書自体を検証する必要があります。(何らかの形式の検証を使用する必要があります。)これにより、クライアントが提示した公開鍵証明書の秘密鍵を持っていることが保証されます。

これを行うには、次の2つの手順が必要です。

  • Certificate RequestTLSメッセージ(TLS 1.1で明示的に許可されている)で認証局の空のリストを送信することにより、証明書を受け入れる予定であるという事実を宣伝できる必要があります。
  • 証明書を信頼するようにSSL/TLSスタックを構成します(これを行うときは、アプリケーション内に独自の検証システムを実装することを忘れないでください。そうしないと、実際に何かが通過します)。

.Netでは、リモート証明書検証コールバックを使用して2番目のポイントに対処できるはずですが、最初のポイントを変更する方法を見つけたことがありません(これはこの質問でも尋ねられました)。

Javaでは、JSSEをX509TrustManager使用すると両方の点に対処できます。

于 2012-04-20T16:30:28.600 に答える