web-dev-qa-db-ja.com

C#のthumb印で証明書を見つける方法

このコードを使用して、thumb印で証明書を見つけています。証明書は個人証明書ストアの証明書マネージャーに存在しますが、このコードはその証明書を見つけられません。

どこで間違っているのか教えてください。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string certThumbPrint = "‎‎fe14593dd66b2406c5269d742d04b6e1ab03adb1";
            X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            // Try to open the store.

            certStore.Open(OpenFlags.ReadOnly);
            // Find the certificate that matches the thumbprint.
            X509Certificate2Collection certCollection = certStore.Certificates.Find(
                X509FindType.FindByThumbprint, certThumbPrint, false);
            certStore.Close();

            // Check to see if our certificate was added to the collection. If no, 
            // throw an error, if yes, create a certificate using it.
            if (0 == certCollection.Count)
            {
                Console.WriteLine("Error: No certificate found containing thumbprint " );
            }
            Console.ReadLine();
}
77
RATHI

同じ問題のグーグルでこの質問につまずいて、答えを見つけました here :私のように、「ソース」のprint印をMMC thumb印をクリップボードにコピーすると、画面の先頭で目に見えない文字をほぼ確実にキャッチできます。

文字列certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

実際に

文字列certThumbPrint = "[〜#〜] invisiblecharacter [〜#〜]fe14593dd66b2406c5269d742d04b6e1ab03adb1";

この不可視文字を削除するか(バックスペースを押すか、その横に削除すると何も起こらないように見えます)、または手でthumb印を再入力するだけで、コードは正常に機能します。 Visual Studioにのみ「非表示の文字を表示する」オプションがある場合は...

198
KenD

Thumb印を含む文字列リテラルには、先頭に 左から右のマーク があります。 MMCが証明書プロパティをリストするとき、テキストが通常右から左にレンダリングされるロケールでも16進バイトが左から右にリストされるように、この文字をthumb印値の前に付けます。

おそらく、エディットコントロールのスタイルを動的に更新するコードを少し書くよりも、プロパティリストの値の1つに文字を追加する方が簡単だったため、これは誰かが取ったショートカットでした。おそらく、ローカライズテスト中のバグレポートの簡単な修正でした。

MMCでは、左から右のマークの幅はゼロではありません。矢印を横切るとカーソルが動くのを見ることができ、16進バイトの最初の行が2番目の行。

Visual Studioなどの他のエディターでは、左から右へのマークに幅はありませんが、矢印を横切ったときにカーソルが移動しないことに注意することで、それを確認できます。 KenDが答えたように、このキャラクターを削除することで問題は解決します。

不可視文字を識別する簡単な方法:キーボードを使用して不可視文字を選択します。次に、Wordの通常の文字の間に貼り付けます。 Wordで選択します。次に、[挿入]> [シンボル]> [その他のシンボル]をクリックします。 「Unicode name」の下の左下を見てください。

17
Edward Brey

これらのLTR "\ u200e"およびRTL "\ u200f"文字がthumb印文字列から削除されるようにするには、次の手順を実行します。

thumbprint = thumbprint.Replace("\u200e", string.Empty).Replace("\u200f", string.Empty).Replace(" ",string.Empty);

空白を削除するための最後の文字列の置換は、証明書の有無にかかわらず私の証明書を見つけるため、完全に必要ではありません。

他の面倒なユニコード文字はここで見つけることができます

TF-8エンコードテーブルとUnicode文字

10
drowhunter

私の2セント:MMCの値をコピーし、空白を有効にしてVSに貼り付けました。

最初に何もありませんでしたが、最後にスペースがありました: "1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57"

ここで、web.configファイルに、内部のすべてのスペースを維持する値を貼り付け、最終スペースを削除します。「1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57」

これは正常に機能します。

「1e52730d0029e6857be623e2fac7a508ac365e57」を使用すると、他の投稿にあるように内部のスペースを削除しても機能しません...

これが役立つことを願っています;)

5
vulcanik

余分な文字を削除し、有効な16進数でないもの(およびToUpper)を削除するために、次のことを行いました。

            thumbprint = Regex.Replace(thumbprint.ToUpper(), @"[^0-9A-F]+", string.Empty);

これにより、cert印を証明書マネージャーのダイアログから直接コピーして、使用箇所に直接貼り付けることができました。

2
Darren Sandford

証明書のすべての証明書を取得し、thumb印IDを出力するコンソールアプリケーションを作成することで、問題を解決できました。コンソール出力をコピーし、thumb印を正確に挿入しました。問題ない。 MMCコンソールからコピーすると、データが似ていても問題が発生するようです。このサイトをすべての証明書の読み取りの開始点として使用しました。

https://msdn.Microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.thumbprint(v = vs.110).aspx

0
David Valdez

このPowerShellスクリプトを実行して、すべてのthumb印を取得し、出力をテキストファイルにリダイレクトして、そこからthumb印をコピーします。

Get-ChildItem -path cert:\LocalMachine\My

出力をテキストファイルにリダイレクトするには、次を使用します。

Get-ChildItem -path cert:\LocalMachine\My > thumbprints.txt
0
Pradeep