5

这个真的很奇怪,我无法弄清楚为什么一种方法有效而另一种方法无效。

我在本地计算机商店中有一个证书和一个指纹。该应用程序在发出 HTTP Web 请求时使用该证书,因此我需要获取它。我想将指纹作为 AppSetting 值存储在 web.config 中。每当我提取 AppSetting 值并使用它来查找证书时,它都找不到它。但是,如果我创建一个局部变量(类变量,只读,常量,等等)并通过它进行搜索,它就可以工作。我在两个值上都完成了 String.Compare() 是完全相同 的。是什么赋予了?我试着看一下 IL,看看我是否能看到一些时髦的东西,但什么也没有。

' This Works '
Dim certificateThumbprint As String = "D0650C9D31CF525D3C82153DCEBC3C3265D75FE3"
Dim certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, certificateThumbprint, False)

' This doesn't '
Dim appSettingcertificateThumbprint = System.Web.Configuration.WebConfigurationManager.AppSettings("CertificateThumbprint")
Dim certCollection2 = certStore.Certificates.Find(X509FindType.FindByThumbprint, appSettingcertificateThumbprint, False)

' Intermediate window shows that '
String.Compare(certificateThumbprint, appSettingcertificateThumbprint, True) = 0
4

5 回答 5

6

So it turns out when you copy and paste the thumbprint string from the certificate's properties window, it's possible to also carry over an invisible hex character that won't show up in your Visual Studio window. (see here)

What I ended up doing was copying the thumbprint to Notepad++, going a line below it, typing it exactly how I saw it, copying it back to the web.config, and running from there. That seemed to work out perfectly.

于 2013-09-18T18:21:16.233 回答
4

我也发现了完全相同的问题,经过广泛搜索,除了您上面建议的那种事情之外,没有找到任何答案。

也许微软可以评论他们的 Certificates.Find 函数的匹配方法,以便我们有机会可靠地使用内置功能。

于 2012-11-02T11:04:31.077 回答
2
  • 粘贴到记事本++
  • 将编码切换为 ANSI
  • 删除乱码
  • 复制
  • 粘贴到 web.config
于 2015-04-08T18:30:30.363 回答
1

此代码有效:

Dim certStore = New X509Store(StoreLocation.CurrentUser)
Const certificateThumbprint As String = "E846D7787F9D43C136FFEBDD03DEDA8DE83E20D8"
certStore.Open(OpenFlags.ReadOnly)
Dim certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint,certificateThumbprint, False)


' This doesn't ( Now it does :)
Dim appSettingcertificateThumbprint = ConfigurationManager.AppSettings("CertificateThumbprint").Substring(2)
Dim certCollection2 = certStore.Certificates.Find(X509FindType.FindByThumbprint, appSettingcertificateThumbprint, False)

请注意从配置管理器中提取后的 .SubString(2)。如果您对两个字符串都执行 .ToCharArray() 并在 Watch Window 中检查数组,您可以检查我为什么这样做。来自 AppSettings 的那个在开始时有 2 个额外的字符。您的情况可能会有所不同,所以我建议 .ToCharArray 并相应地编辑字符串。

我不确定为什么 .NET 会这样做。

祝你好运 !

于 2013-09-25T14:55:25.960 回答
0

在我看来,您的 WORKING 版本专门将变量作为 STRING 变暗,而非工作版本没有指定 AS STRING(因此您得到一个 OBJECT)。

您应该在使用它时将 appSettingcertificateThumbprint 作为字符串或使用 .ToString 方法(在 .Find 方法中)。

于 2013-01-30T18:11:33.050 回答