2017-10-19 138 views
0

我有一个Web应用程序,它接收一个已签名的令牌,并且应该使用已预装在最终用户计算机上的证书来验证该签名。我想访问商店并获取我想要使用的确切的特定证书,到目前为止,我有能力到达商店并计算内部证书,但我无法找到特定的证书。查找来自Windows证书存储区的特定证书(C# - ASP.Net)

我的策略是填写一个X509Certificate2Collection,按主题名称填写证书的搜索结果,因为它足够独特,可以选择确切的必需证书,然后我拉取集合中的第一个元素(希望是唯一的)并使用它,这是我在下面的代码中做的,到目前为止,我总是得到一个例外,certs是空的,我不能将任何东西都转换为字符串。

这工作正常,如果我用序号搜索,但我的证书的序列号是00,我有我的商店8这些!

如何从商店获取特定证书并且能够以编程方式使用它?

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

'最终用户的机器' - 你的意思是,远程客户端?一定不行!没办法,对不起,因为你想做错事。 Web应用程序无法访问客户端资源。不应该。有一个类似的问题解释回应:https://stackoverflow.com/a/46707759/3997611 – Crypt32

+0

我会澄清我想要做什么.. 我有多个网络应用程序,连接到第三方SSO服务器,当用户导航到一个URL时,他被重定向到该SSO服务器以登录,并用一个签名的cookie重定向回来。我想在我让他进入我的受限制页面之前验证该cookie。所以我只想加载证书并使用它来验证令牌签名。 – j0zeft

+0

看看上面的链接。它清楚地解释了为什么你不能在Web应用程序中访问客户端资源。必需的信息必须预先配置在Web应用程序中,或者如果底层协议具有此功能,则由客户端提供。在你的情况下,如果cookie不包括证书,那么你必须使用本地(web服务器)证书存储来获得所需的证书来验证签名。 – Crypt32

回答

0

从@ Crypt32考虑的建议后,我搬到我的令牌到应用程序将被托管,所以这样一来我不是在寻找最终用户的计算机上的证书,而是它会在本地存储在托管应用程序的服务器上。要搜索的令牌,我在问题中使用完全相同的代码在那里与非常轻微编辑:

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() 

我所做的只是与X509FindType.FindBySubjectDistinguishedName 更换X509FindType.FindBySubjectName在这种情况下,在证书主题的所有元素必须以该确切格式列出。

相关问题