15

証明書を [個人] -> [証明書] にインポートしました。

次のコード行を使用して、シリアル番号で証明書を見つけますが、できません。

    public X509Certificate2Collection FindCerts(string serialNumber)
    {
        var searchType = X509FindType.FindBySerialNumber;
        var storeName = "MY";

        var certificatesStore = new X509Store(storeName, StoreLocation.LocalMachine);
        certificatesStore.Open(OpenFlags.OpenExistingOnly);

        var matchingCertificates = certificatesStore.Certificates.Find(searchType, serialNumber, true);

        certificatesStore.Close();

        return matchingCertificates;
    }

証明書が certificatesStore.Certificates リストにあるにもかかわらず、証明書が見つからない理由を教えてください。

注: 私の証明書は Go Daddy によって作成されました

4

9 に答える 9

23

プロパティ ウィンドウからコピーする代わりにシリアル番号を入力することで、この問題を解決しました。このウィンドウからコピーすると、シリアル番号の先頭に奇妙な文字が含まれている理由がわかりません。

于 2013-03-18T04:48:17.017 に答える
8

私もこの問題に遭遇したので、certmgr.msc から値をコピーして貼り付けることができるように回避策を作成しようとしました。

私がしたことの要約:

// The value below is pasted from certmgr.msc
var sslCertificateSerialNumber="‎47 9f da c4 ad d7 33 a6 4c ad 54 d3 d9 95 67 1c"; 


// Remove all non allowed characters that entered the value while copy/paste
var rgx = new Regex("[^a-fA-F0-9]");
var serial = rgx.Replace(sslCertificateSerialNumber, string.Empty).ToUpper();

これで、コピー/貼り付けされた値を持つ正しい証明書が見つかりました。

于 2015-01-07T14:54:58.523 に答える
0

証明書のシリアル番号は、無制限の長さの大きな整数を示すバイナリデータシーケンスです。どこかでテキストを見た場合、これは、テキストがシリアルとして書き込まれたか、Base64またはBase16でエンコードされたバイナリシリアルのいずれかが表示されていることを意味している可能性があります。後者の場合、簡単な方法でそれを見つけることはできません-シリアルをデコードしてその方法を試す必要があります。

于 2013-02-18T06:21:28.823 に答える
0

私は昨日同様の問題に遭遇し、既存の証明書が見つからない理由を突き止めるために何時間も費やしました。Certificates.Find メソッドは大文字と小文字を区別して検索を実行しているようです。String.Compare を使用して再帰的なアプローチを取りました。

X509Certificate2 storedCert = null;
for (int i = 0; i < store.Certificates.Count; i++)
{
    if (String.Compare(store.Certificates[i].SerialNumber, MySerialNum, true) == 0)
    {
        storedCert = store.Certificates[i];
        break;
    }
}
于 2015-01-27T15:09:32.107 に答える
0

シリアル番号で検索するには、mmc スナップインによって報告されたシリアルから開始して、すべての空白を削除し、すべてのアルファベットを大文字にします。私のために働いた。これにより、次のようなものが得られます...

008CC59B72BE954F93F1435F6B86227600

他の人が言ったように、文字列の先頭にある「目に見えない特殊文字」に注意してください。メモ帳にコピーしてメモ帳からコピーして削除します。同じことが、証明書プロパティ ウィンドウからコピーされたすべてのフィールドにも当てはまります。

于 2015-12-04T13:22:47.903 に答える
0

serialNumber が大文字の文字列であることを確認してください。sn が小文字の場合、証明書を見つけるのに問題がありました。証明書の詳細ウィンドウから sn をコピーする場合は、空白も削除します

于 2013-09-21T10:53:22.470 に答える
0

マシン ストアに証明書が存在することが確かな場合は、Find() の 3 番目のパラメーターを「false」にしてみてください。

于 2013-02-18T04:53:19.327 に答える
0

抽出しようとしているのが GoDaddy によって発行された証明書である場合は、これを使用できます。

var certificateStore= new X509Store(StoreLocation.LocalMachine);
certificateStore.Open(OpenFlags.ReadOnly);
var certificates = certificateStore.Certificates;
foreach (var certificate in certificateStore)
            {
                if (certificate.Issuer.Contains("GoDaddy"))
                {
于 2013-02-18T07:37:02.840 に答える