Является ли серийный номер уникальным ключом для сертификата X509? - PullRequest
18 голосов
/ 02 февраля 2012

Является ли серийный номер сертификата уникальным ключом для сертификата X509?Пользователь выбирает сертификат, а программа сохраняет серийный номер в настройках.Будет ли следующий код возвращать выбранный сертификат?

public static X509Certificate2 GetCertificateBySerialNumber(string serialNumber)
{
    X509Certificate2 selectedCertificate = null;
    X509Store store = null;
    try
    {
        // get certificate from the store "My", "CurrentUser"
        store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
        X509Certificate2Collection allCertificates = (X509Certificate2Collection)store.Certificates;
        X509Certificate2Collection foundCertificates = (X509Certificate2Collection)allCertificates.Find(X509FindType.FindBySerialNumber, serialNumber, false);

        // select the first certificate in collection
        foreach (X509Certificate2 certificate in foundCertificates)
        {
            selectedCertificate = certificate;
            break;
        }
    }
    finally
    {
        if (store != null)
        {
            store.Close();
        }
    }

    return selectedCertificate;
}

ОБНОВЛЕНИЕ: я закончил с использованием отпечатка сертификата, как предложено jglouie .

Ответы [ 4 ]

14 голосов
/ 02 февраля 2012

Нет.Например, OpenSSL позволяет пользователю устанавливать это при создании сертификатов.

См .: http://www.openssl.org/docs/apps/x509.html

-set_serial n указывает серийный номер для использования.Эта опция может использоваться с опциями -signkey или -CA.Если используется вместе с параметром -CA, файл серийного номера (как указано в параметрах -CAserial или -CAcreateserial) не используется.

Серийный номер может быть десятичным или шестнадцатеричным (если ему предшествует 0x).Также можно указывать отрицательные серийные номера, но их использование не рекомендуется.

10 голосов
/ 03 августа 2012

Как уже упоминалось в другом ответе, серийный номер должен быть уникальным в ЦС. Таким образом, один серийный номер нельзя использовать в качестве уникального идентификатора сертификата - сертификаты из разных ЦС могут иметь один и тот же серийный номер. Вам необходимо сохранить комбинацию свойств Issuer и SerialNumber. Кроме того, для самозаверяющих сертификатов и самодельных программ CA номера скорее всего будут совпадать, поскольку многие люди начнут нумерацию с 0.

4 голосов
/ 19 марта 2012

Да, в соответствии со спецификацией X.509 серийный номер является уникальным для конкретного CA:

4.1.2.2 Серийный номер

Серийный номер являетсяцелое число, назначенное центром сертификации каждому сертификату.Он ДОЛЖЕН быть уникальным для каждого сертификата, выданного данным СА (т. Е. Имя и серийный номер эмитента определяют уникальный сертификат).

3 голосов
/ 08 октября 2015

TL; DR : Вы должны использовать составной ключ имени эмитента + серийный номер. Если вам нужен простой ключ, используйте отпечаток сертификата.


Цитирование @ThomasPornin из security.stackexchange:

В сертификате серийный номер выбирается центром сертификации, выдавшим сертификат. сертификат. Это просто написано в сертификате. CA может выбирать серийный номер любым удобным для него способом, не обязательно случайным образом (и он должен умещаться в 20 байтов). CA предполагается на выбор уникальные серийные номера, то есть уникальные для CA . Вы не можете рассчитывать на серийный номер, являющийся уникальным во всем мире; в мире грез X.509, это пара эмитентDN + последовательный, который уникален во всем мире (каждый CA имея свое уникальное отличительное имя и стараясь не использовать его повторно серийные номера).

Отпечаток - это значение хеша, вычисленное по полному сертификату, который включает в себя все его поля, включая подпись. Это один уникальный во всем мире, для данного сертификата, вплоть до неотъемлемой сопротивление столкновению используемой хэш-функции. Программное обеспечение Microsoft имеет тенденцию использовать SHA-1, для которого известны некоторые теоретические недостатки, но фактическое столкновение не было произведено (пока).

От: https://security.stackexchange.com/questions/35691/what-is-the-difference-between-serial-number-and-thumbprint

...