2017-05-30 8 views
2

Windowsの個人証明書ストアを使用して、ユーザーが有効な証明書を選択した後に証明書を使用して認証する機能があります。X509Certificate2オブジェクトのスマートカードが削除されたときのイベント

public static byte[] SignDataSHA512RSA(X509Certificate2 certificate, byte[] data) 
     { 
      using (var rsa = certificate.PrivateKey as RSACryptoServiceProvider) 
      { 
       if (rsa == null) 
       { 
        return null; 
       } 

       return rsa.SignData(data, CryptoConfig.MapNameToOID("SHA512")); 
      } 
     } 

それはRSACryptoServiceProviderクラスを使用して、かなりうまく機能:それは単に以下でのチャレンジに署名します。この機能では、通常の証明書とスマートカード証明書の両方を使用できます。スマートカードがあり、それにPINが必要な場合、Windowsはそれをすべてダイアログに表示します。

この機能には、この操作にスマートカードを使用する場合(ハードウェアを適用する場合は、rsa.CspKeyContainerInfo.RemovableHardwareDeviceがあります)、この機能にはセキュリティが必要ですセッション中いつでもアクセスできます。つまり、自動的にログアウトするために、スマートカードが取り外されたときにイベントが必要です。

certificate.PrivateKeyが1分おきにアクセス可能であることを確認するタイマージョブがありますが、ユーザーにスマートカードを挿入するように促す前にスローしないでください。ユーザーはCancelを押します。

この機能はWindows 7もサポートしているため、UWPライブラリを使用することはできません。これを達成する方法はありますか?

答えて

3

PC/SCを使用してカードの取り外しを確認できます。ウィンドウズではWinSCardライブラリに実装されています。このSO answerを参照してください。

また、C#の実装pcsc-sharpもあります。

+0

ライブラリは素晴らしいと思われます。ありがとう。しかし、 'X509Certificate2'をスマートカードリーダに関連付けることは依然として課題です。複数のスマートカードリーダーが接続されている場合は、適切なカードの取り外しがこれを引き起こすことを確認する必要があります。私は 'X509Certificate2'と' SmartCardReader'属性の属性を調べましたが、一致するものは見つかりませんでした。 'X509Certificate2'が持っているのは' CspKeyContainerInfo.KeyContainerName(UUID/string) 'だけですが、それが本当に関連しているかどうかは分かりません。 – Natan

+0

@Natanはい、それは問題です。別のCSPの古い時代には、CSP名と関連付けることができましたが、それでも同じベンダーから2枚のカードを区別することはできませんでした。今では、ミニスマートカードの概念を持つBase SmartCard Crypto Providerとそれを扱う苦労があります。 – pepo

+0

@Natanあなたは[Pkcs11Interop](https://www.pkcs11interop.net/)を使用し、カードが挿入されたら自分でカードを検索することができます。実際、多くのベンダーのドライバーは、毎回カード全体を読む必要がないように、ある種のキャッシュと同じことをしています。しかし、それはあなたがロードするpkcs#11ライブラリとカード読み取りが比較的遅いかどうかを知る必要があることを意味します。だから...あなたは純粋な.netで始まって2つのサードパーティのライブラリで終わりました:) – pepo

関連する問題