4

XML データを生成し、生成された XML に署名するライブラリを開発しています。pkcs12 証明書 (pem ファイルから OpenSSL で生成) を Windows 証明書ストアにインストールしました。

C#コードから証明書をロードしています

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = null;

foreach (var item in store.Certificates)
{
    if (item.SubjectName.Name.Contains("CN=IDENTIFIER"))
    {
        cert = item;
        break;
    }
}
store.Close();

私の場合、CN 識別子は私の姓 + 姓です。証明書はサードパーティから取得されます。だから私は識別子に影響を与えないと思います。

そして、ここに質問があります:

C# からこの証明書を正確に識別する方法はありますか。将来的には、複数の証明書が同じ X509 パラメータ (CN など) を持つ可能性があります。

前もって感謝します。

4

2 に答える 2

4

ユージーンの答えを拡張...

CertificatesプロパティはX509StoreですX509CertificateCollection

おそらく、そのFindメソッドとX509FindType. 証明書を検索するさまざまな方法が用意されています。厳密に言えば、サブジェクト DN とサブジェクトの代替名の両方が、証明書に関連付けられたエンティティを識別するために重要である必要があります。ただし、プレゼンテーションの観点からこれを行うツールはほとんどありません (これは、たとえば、テーブルでかなり雑然とする可能性があります)。

GregS と Eugene が指摘したように、証明書の拇印 (他のツールではフィンガープリント/ハッシュとも呼ばれます)は、発行者に関係なく、特定の証明書を一意に識別します。で使用できますX509FindType

Windows/.Net/SSL の世界では、さまざまな場所で拇印が使用されています。特に、特定の証明書を選択して HTTPS ポートにインストールする方法です

于 2012-05-03T12:25:08.180 に答える
4

はい、CN に同じ識別子が含まれている可能性があります (たとえば、証明書が事業体に対して発行された場合)。

証明書は通常、次の組み合わせのいずれかで識別されます。1) 発行者名 (CN ではなく RDN、複数のフィールドを持つ完全な名前レコード) + 証明書のシリアル番号 (1 つの CA 内で一意) 2) 発行者名 + 証明書のハッシュ

証明書を検索する前に発行者名がわからない場合は、見つかった証明書のリストをユーザーに提示し、ユーザーが証明書の 1 つを選択したら、後で参照できるように証明書ハッシュを保存します。

小規模なシステム (エンドユーザーのコンピューター) では、通常、MY ストア内の証明書の数は少なく、ハッシュ衝突の可能性は最小限です。大規模なシステムでは可能性が高いため、発行者名も使用されます。

于 2012-05-03T09:53:11.623 に答える