2012-05-03 7 views
3

Я разрабатываю библиотеку, которая генерирует XML-данные и обозначает генерируемый XML. Я установил сертификат pkcs12 (сгенерированный с OpenSSL из файла pem) в хранилище сертификатов Windows.Явно признаю сертификат в хранилище сертификатов 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 является: мой prename + фамилия. Сертификат поступает от третьего лица. Поэтому я думаю, что я не влияю на идентификаторы.

И здесь возникает вопрос:

Есть ли способ, чтобы точно определить этот сертификат от C#. В будущем возможно, что несколько сертификатов имеют одинаковые параметры X509 (CN и т. Д.).

Заранее спасибо.

ответ

3

Да, возможно, что CN содержит тот же идентификатор (например, когда сертификат выдается для бизнес-объекта).

сертификаты, как правило, отличаются одной из следующих комбинаций: ) наименование эмитента 1 (не CN, но RDN, полное имя записи с несколькими полями) + серийный номер сертификата (уникальный в пределах одного CA) имя 2) Эмитент + хеш сертификата

Если вы не знаете имя эмитента перед поиском сертификата, вы можете представить список найденных сертификатов пользователю и после того, как он выберет один из сертификатов, сохраните хэш сертификата для дальнейшего использования.

На небольших системах (компьютер конечного пользователя) количество сертификатов в MY-магазине обычно невелико и вероятность столкновения хэшей минимальна. В крупных системах вероятность выше, и поэтому используется название Эмитента.

+0

Благодарим вас, серийный номер certerName + cert - именно то, что я искал. IETF говорит: Серийный номер ДОЛЖЕН быть положительным целым числом, назначенным ЦС для каждого сертификата. Он ДОЛЖЕН быть уникальным для каждого сертификата, выданного данным ЦС (то есть имя эмитента и серийный номер идентифицируют уникальный сертификат). ЦС ДОЛЖНЫ принудительно ввести serialNumber в неотрицательное целое число. Но что вы имеете в виду с RDN? – csteinmueller

+0

Я думаю, что RDN является именем пользователя, которое имеет тип X500DistinguishedName – csteinmueller

+0

@csteinmueller RDN означает RelativeDistinguishedName. Это тип-структура с несколькими полями.ПРИМЕЧАНИЕ. Серийный номер является целым числом, но длина этого целого не определена, а серийные номера длиной 20 байтов не являются редкостью. –

3

Развивая ответ Евгения ...

Certificates property of X509Store является X509CertificateCollection.

Возможно, вас заинтересует его Find method and the X509FindType. Он предлагает несколько способов поиска сертификата. Строго говоря, для определения объекта, связанного с сертификатом, важно указать как the subject DN and the subject alternative names. Тем не менее, несколько инструментов делают это с точки зрения представления (это может быть довольно загроможденным в таблице, например).

Как указал Грегс и Юджин, certificate thumbprint (also known as fingerprint/hash in other tools) однозначно идентифицирует конкретный сертификат, независимо от его эмитента. Это can be used with X509FindType.

Отпечатки пальцев используются во многих местах в мире Windows /. Net/SSL. В частности, it's the way to pick a given certificate to install on an HTTPS port.

Смежные вопросы