5

これは本当に奇妙で、なぜある方法が機能し、別の方法が機能しないのか理解できません。

ローカル コンピューター ストアに証明書があり、その拇印があります。アプリは HTTP Web リクエストを作成するときに証明書を使用するため、取得する必要があります。拇印を AppSetting 値として web.config に保存したいと考えています。AppSetting の値を取得し、それを使用して証明書を検索するたびに、それが見つかりません。ただし、ローカル変数(クラス変数、読み取り専用、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
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

私もまったく同じ問題を見つけました。広範な検索の結果、上記で提案した種類以外の回答は見つかりませんでした。

おそらく Microsoft は、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)

Configuration Manager から抽出した後の .SubString(2) に注意してください。文字列に対して .ToCharArray() を実行し、ウォッチ ウィンドウで配列を調べると、なぜそうしたのかを確認できます。AppSettings からのものには、最初に 2 つの余分な文字がありました。あなたのケースは異なるかもしれないので、.ToCharArray とそれに応じて文字列を編集することをお勧めします。

ただし、.NETがこれを行う理由はわかりません。

幸運を !

于 2013-09-25T14:55:25.960 に答える
0

動作しているバージョンは変数ASSTRINGを具体的にDIMしているように見えますが、動作していないバージョンはAS STRINGを指定していません(したがって、オブジェクトを取得しています)。

Dim appSettingcertificateThumbprint AS STRINGを使用するか、(。Findメソッドで)使用するときに.ToStringメソッドを使用する必要があります。

于 2013-01-30T18:11:33.050 に答える