.NET 通过 AppSetting 通过指纹查找证书

Posted

技术标签:

【中文标题】.NET 通过 AppSetting 通过指纹查找证书【英文标题】:.NET Find Certificate by thumbprint via AppSetting 【发布时间】:2012-09-18 13:20:54 【问题描述】:

这个真的很奇怪,我不明白为什么一种方法有效而另一种方法无效。

我在本地计算机商店中有一个证书和一个指纹。该应用程序在发出 HTTP Web 请求时使用该证书,因此我需要获取它。我想将指纹作为 AppSetting 值存储在 web.config 中。每当我提取 AppSetting 值并使用它来查找证书时,它都找不到它。但是,如果我创建一个局部变量(类变量,只读,常量,等等)并通过它进行搜索,它就可以工作。我已经完成了 String.Compare() 两个值是 exactly 相同。是什么赋予了?我试图查看 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

【问题讨论】:

为什么要把字符串和ignoreCase=True比较?尝试另一个重载 String.Compare(String, String, StringComparision) 并使用 StringComparision.InvariantCulture 调用它。 【参考方案1】: 粘贴到记事本++中 将编码切换为 ANSI 删除乱码 复制 粘贴到 web.config 中

【讨论】:

【参考方案2】:

此代码有效:

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 会这样做。

祝你好运!

【讨论】:

以后,我建议将字符串从证书管理器窗口复制粘贴到运行窗口或记事本之类的地方,编辑出字符串,然后从运行/记事本复制/粘贴到 web.config。我经历了与你一样令人沮丧的经历..【参考方案3】:

事实证明,当您从证书的属性窗口复制并粘贴指纹字符串时,还可能会携带一个不会显示在 Visual Studio 窗口中的不可见十六进制字符。 (see here)

我最终做的是将指纹复制到 Notepad++,在它下面一行,按我看到的方式输入,将它复制回 web.config,然后从那里运行。这似乎很完美。

【讨论】:

是的,没有骰子。由于那个非打印字符,它实际上只是从 app.config 中吸入不同的字符串。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于.NET 通过 AppSetting 通过指纹查找证书的主要内容,如果未能解决你的问题,请参考以下文章

如何通过javascript获取人的指纹[关闭]

如何使用 ASP.NET 在 web.config 文件中写入 appSetting?

从类库访问 Asp.net-core 中的 appsetting.json

设备指纹也能检测业务风险?

.net core读取配置文件appsetting.json

如何将 appsetting.json 部分加载到 .NET Core 中的 Dictionary 中?