2016-08-08 7 views
1

Je suis en mesure d'identifier avec succès les certificats clients dans une application .NET client lourd, et l'utilisateur est en mesure d'en sélectionner un avec succès.X509Certificate2 demande PIN

X509Store store = new X509Store("MY", StoreLocation.CurrentUser); 
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly); 
var fcollection = store.Certificates.Find(X509FindType.FindByApplicationPolicy, "1.3.6.1.5.5.7.3.2", true); 
// other stuff where user selects one of them 

Maintenant, comment puis-je demander à l'utilisateur de répondre au défi (par exemple le code PIN dans ce cas)?

I see Il existe une classe SignedXML.ComputeSignature(), mais elle nécessite un flux d'octets, et je ne sais pas d'où elle vient (peut-être dans certificate.RawData []?).

Je ne suis pas vraiment intéressé par l'obtention de la broche réelle car je suis celle de la carte/broche.

EDIT:

J'ai essayé d'utiliser la clé privée de la carte à puce (et même crypté de celui-ci), mais je ne suis pas demandé mon NIP.

RSACryptoServiceProvider rsacsp = (RSACryptoServiceProvider)certificate.PrivateKey; 
UnicodeEncoding ByteConverter = new UnicodeEncoding(); 
byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt"); 
var encryptedData = RSAEncrypt(dataToEncrypt, rsacsp.ExportParameters(false), false); 

Répondre

0

S'il s'agit d'une carte à puce, l'invite de connexion se produira lorsque vous essaierez d'utiliser la clé privée du certificat.

Vous devez utiliser le certificat en quelque sorte et valider le résultat. Par exemple, vous pouvez utiliser le certificat pour signer quelque chose. Une fois cette opération de signature effectuée, l'invite de broche apparaît.

Si vous n'avez pas vraiment besoin d '"utiliser" le certificat, vous voulez juste valider qu'il est là et que l'utilisateur connaît la broche, alors vous avez besoin d'une sorte de preuve de travail. Le certificat peut être utilisé pour signer un défi et un serveur distant peut valider la signature à l'aide d'une clé appartenant à une racine approuvée. Gardez à l'esprit ce qui est difficile d'obtenir le droit, comme en vous assurant que vous n'êtes pas à une attaque de relecture, etc.

+0

Ne semble pas fonctionner. J'ai ajouté le code affiché ci-dessus dans l'édition où la clé privée est utilisée pour crypter du texte arbitraire, mais on ne me demande pas le code PIN. – micahhoover

+0

Il ne semble pas que la clé privée/le certificat soit protégé par une broche, si cela a vraiment été le cas. – vcsjones

+0

peut-être pas ... quand je fais cela à partir de MVC lorsque SslFlags = "SslNotationCertificate" il sollicite mon code PIN et il ne fonctionnera pas sauf si c'est le bon code PIN. Donc, il semble que cela devrait aussi être faisable à partir d'une application client lourd. – micahhoover