Является ли серийный номер уникальным ключом для сертификата X509?

Является ли серийный номер сертификата уникальным ключом для сертификата 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;
}

UPDATE: я закончил использование отпечатка сертификата, как это было предложено jglouie.

Ответы

Ответ 1

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

Смотрите: http://www.openssl.org/docs/apps/x509.html

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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


Цитата @ThomasPornin из security.stackexchange:

В сертификат серийный номер выбирается CA, который выпустил сертификат. Он просто написан в сертификате. CA может выберите серийный номер каким-либо образом, как он считает нужным, не обязательно (и он должен соответствовать 20 байтам). Предполагается, что CA уникальные серийные номера, то есть уникальные для ЦС. Вы не можете рассчитывать на серийный номер уникален во всем мире; в мире сновидений X.509, это номер выпуска emerDN +, который уникален во всем мире (каждый CA имея свое уникальное выдающееся имя и не заботясь о повторном использовании серийные номера).

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

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