.NET通过AppSetting通过thumbprint查找证书

时间:2012-09-26 20:26:29

标签: .net vb.net certificate app-config

这个非常奇怪,我无法弄清楚为什么一种方法有效,一种方法没有。

我的本​​地计算机商店有证书,还有指纹。应用程序在发出HTTP Web请求时使用证书,因此我需要获取它。我想将指纹存储在web.config中作为AppSetting值。每当我拉取AppSetting值并使用它来查找证书时,它都找不到它。但是,如果我创建一个局部变量(类变量,readonly,const,等等......)并通过它进行搜索,它就可以工作。我已经完成了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

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

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

也许Microsoft可以评论他们的Certificates.Find功能的匹配方法,以便我们有机会可靠地使用内置功能。<​​/ p>

答案 2 :(得分:2)

  • 粘贴到Notepad ++
  • 将编码切换为ANSI
  • 删除垃圾字符
  • 复制
  • 粘贴到web.config

答案 3 :(得分: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)

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

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

祝你好运!

答案 4 :(得分:0)

在我看来,你的WORKING版本特别指出变量AS STRING,而非工作版本没有指定AS STRING(因此你得到一个OBJECT)。

您应该使用Dim appSettingcertificateThumbprint AS STRING或在使用它时使用.ToString方法(在.Find方法中)。