Как определить тип сертификата (A1 или A3)?

У меня есть 2 типа сертификатов на моей машине, один A1, а другой A3, при загрузке одного из них в объект X509Certificate2 как я могу программно определить, является ли он A1 или A3?

Я понимаю, что если сертификат A3 не подключен, закрытый ключ недоступен. Учтите, что оба сертификата действительны/установлены и подключены.

Редактировать

Я только что обнаружил, что типы A1 и A3 определяются законодательством конкретной страны (Бразилия), поэтому позвольте мне объяснить, в чем разница:

ICP-Brasil допускает 8 типов цифровых сертификатов, разделенных на 2 серии (А и S).

Серия A (A1, A2, A3 и 4) состоит из сертификатов цифровой подписи, используемых для проверки личности в Интернете, электронной почты, виртуальных частных сетей (VPN) и электронных документов с проверкой целостности их Информации.
Серия S (S1, S2, S3 и S4) включает сертификаты конфиденциальности, которые используются при кодификации документов, баз данных, сообщений и другой конфиденциальной электронной информации. Восемь типов различаются по использованию, уровню безопасности и достоверности.
(Жизель Рибейро, Источник)

Типы сертификатов

Итак, чтобы обновить мой вопрос, я хочу определить, исходит ли сертификат от смарт-карты с возможностью генерации ключа.


person Nicke Manarin    schedule 05.01.2017    source источник
comment
Что такое A1 и A3?   -  person Crypt32    schedule 05.01.2017
comment
@Crypt32 Crypt32 Извините, A1 - это закрытый ключ с программной поддержкой, A3 - закрытый ключ с аппаратной поддержкой. Файлы Crt/Pfx по сравнению со смарт-картами.   -  person Nicke Manarin    schedule 06.01.2017
comment
Ваша ссылка на источник не работает.   -  person Antônio Medeiros    schedule 28.06.2019
comment
Официальная документация, определяющая A1 и A3, выглядит следующим образом: DOC-ICP-04 — Минимальные реквизиты для политик сертификации ICP-Бразилия   -  person Antônio Medeiros    schedule 28.06.2019
comment
comment
Я исправил ссылку.   -  person Nicke Manarin    schedule 28.06.2019
comment
Кстати, я больше не могу это проверить. У меня нет с собой удостоверения формата А3.   -  person Nicke Manarin    schedule 28.06.2019


Ответы (1)


Предположительно, ваша номенклатура A1 и A3 соответствует бразильскому стандарту (e-CPF/e-CNPJ/что-то в этом роде). Насколько я могу судить, эти термины означают:

  • A1: Закрытый ключ программного обеспечения
  • A3: Аппаратный закрытый ключ

(Мне действительно любопытно, что такое A2, но я отвлекся).

С технической точки зрения, сертификаты не знают, где находятся их ключи. Таким образом, сертификат не знает, является ли его закрытый ключ (где бы он ни был) аппаратным или программным. Но на основе http://www.bcb.gov.br/sfn/ced/ManualdeSeguran%C7adaRSFN-v32.pdf и http://oid-info.com/get/2.16.76.1.2, похоже, вы можете сделать что-то вроде:

private static bool IsBrazilA1Certificate(X509Certificate2 cert)
{
    // End with the "." so it matches on children, but not that OID.
    return HasParentEku(cert, "2.16.76.1.2.1.");
}

private static bool IsBrazilA3Certificate(X509Certificate2 cert)
{
    // End with the "." so it matches on children, but not that OID.
    return HasParentEku(cert, "2.16.76.1.2.3.");
}

private static bool HasParentEku(X509Certificate2 cert, string oidFragment)
{
    var ekuExtension = (X509EnhancedKeyUsageExtension) cert.Extensions["2.5.29.37"];

    if (ekuExtension == null)
    {
        return false;
    }

    foreach (Oid eku in ekuExtension.EnhancedKeyUsages)
    {
        if (eku.Value.StartsWith(oidFragment))
        {
            return true;
        }
    }

    return false;
}

Поскольку у меня нет бразильского сертификата A1 или A3, я не могу проверить это, но это лучшее, что я могу придумать из описания. В противном случае вы спрашиваете: «У этого есть закрытый ключ?» (cert.HasPrivateKey) и "защищен ли закрытый ключ аппаратно?" (гораздо более сложный вопрос).

Редактировать: ничего не стоит тот факт, что приведенный выше код не соответствует обычным правилам проверки EKU. Обычно сертификат без расширения EKU рассматривается так, как если бы он имел все EKU. Но поскольку вы явно ищете что-то, созданное в соответствии с бразильской политикой A1 или A3, оно соответствует тому, что вы запрашивали. (Кроме того, это единственный раз, когда я когда-либо видел, что что-либо должно быть проверено с помощью правила на основе StartsWith, обычно политика представляет собой определенный OID EKU)

person bartonjs    schedule 05.01.2017
comment
Я не знал, что A1/A3 был стандартом только для Бразилии. Для бразильцев общеизвестно (и я думал, что это известно во всем мире), что A1 означает сертификат на основе программного обеспечения, а A3 означает сертификат на основе оборудования. Извините, я обновлю свой вопрос. - person Nicke Manarin; 06.01.2017
comment
Этот фрагмент кода возвращает false для обоих сертификатов. Нет EnhancedKeyUsages, начинающегося с 2.16.76.1.2.3. :( - person Nicke Manarin; 06.01.2017
comment
@NickeManarin, возможно, вам следует проверить коды OID в соответствии со стандартами, установленными ICP-Brasil - person VBobCat; 22.09.2017
comment
@VBobCat Интересно. Я проверю с некоторыми сертификатами... Спасибо. - person Nicke Manarin; 26.09.2017