2017-10-19 18 views
0

J'ai une application Web qui reçoit un jeton signé et doit vérifier cette signature avec un certificat préinstallé sur la machine de l'utilisateur final. Je veux accéder au magasin et obtenir le certificat particulier que je veux utiliser et jusqu'à présent, je suis capable d'atteindre le magasin et de compter les certificats à l'intérieur, mais je ne trouve pas le certificat en particulier.Localisation d'un certificat spécifique à partir du magasin de certificats Windows (C# - ASP.Net)

Ma stratégie consiste à remplir un X509Certificate2Collection avec les résultats de la recherche pour le certificat par nom de sujet car il est assez unique pour choisir le certificat exact requis, puis je tire le premier élément de la collection (j'espère le seul) et l'utilise, c'est ce que je fais dans le code ci-dessous et jusqu'à présent, je reçois toujours une exception que certs est vide et je ne peux pas convertir rien en chaîne.

Cela fonctionne très bien si je recherche avec le numéro de série, mais le numéro de série de mon certificat est 00 et j'en ai 8 dans mon magasin!

Comment puis-je obtenir un certificat particulier du magasin et pouvoir l'utiliser par programme?

X509Store st0re = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
      st0re.Open(OpenFlags.ReadOnly); 
      count = st0re.Certificates.Count;  //Count the certificates in the store 
      X509Certificate2Collection certs = st0re.Certificates.Find(
       X509FindType.FindBySubjectName, 
       "C=US, S=WA, L=Redmond, O=Microsoft Corporation, OU=Web Services", 
       true); 
      st0re.Close(); 

      Output = certs[0].ToString();  // = count.ToString() 
+0

'à la machine de l'utilisateur final' - vous voulez dire client distant? Sûrement pas! Pas question, désolé, parce que vous essayez de faire quelque chose de mal. L'application Web n'a aucun accès aux ressources client. Et ne doit pas. Il y a une réponse expliquée à une question similaire: https://stackoverflow.com/a/46707759/3997611 – Crypt32

+0

Je vais clarifier ce que j'essaie de faire .. J'ai plusieurs applications web, connectées à un SSO tiers serveur, lorsque l'utilisateur accède à une URL, il est redirigé vers ce serveur SSO pour se connecter et redirigé avec un cookie signé. Je veux vérifier ce cookie avant de le laisser entrer dans mes pages restreintes. Donc, je veux juste charger le certificat et l'utiliser pour vérifier la signature du jeton. – j0zeft

+0

Regardez le lien ci-dessus. Il explique clairement pourquoi vous ne pouvez pas et ne devez pas accéder aux ressources client dans une application Web. Les informations requises doivent être préconfigurées dans une application Web ou fournies par le client si le protocole sous-jacent possède une telle fonctionnalité. Dans votre cas, si le cookie n'inclut pas le certificat, vous devez utiliser le magasin de certificats local (serveur Web) pour obtenir le certificat requis afin de valider la signature. – Crypt32

Répondre

0

Après avoir examiné les suggestions de @ Crypt32, je me suis déplacé mes jetons à l'endroit où la demande sera accueillie, cette façon, je ne suis pas à la recherche sur la machine de l'utilisateur final pour un certificat, mais il sera sur place stocké sur le serveur hébergeant l'application. Pour rechercher le jeton, j'utilise exactement le même code là-haut dans la question d'une modification très légère:

X509Store st0re = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
     st0re.Open(OpenFlags.ReadOnly); 
     count = st0re.Certificates.Count;  //Count the certificates in the store 
     X509Certificate2Collection certs = st0re.Certificates.Find(
      X509FindType.FindBySubjectDistinguishedName, 
      "C=US, S=WA, L=Redmond, O=Microsoft Corporation, OU=Web Services", 
      true); 
     st0re.Close(); 

     Output = certs[0].ToString();  // = count.ToString() 

Tout ce que je l'ai fait était de remplacer X509FindType.FindBySubjectName avec X509FindType.FindBySubjectDistinguishedName Dans ce cas, tous les éléments du sujet du certificat doivent être répertoriés dans ce format exact.