Как проверить, является ли сертификат X509 сертификатом CA?

У меня есть экземпляр X509Certificate в Java, и мне нужно определить, является ли он сертификатом CA или сертификатом пользователя.

Может ли кто-нибудь помочь?

Спасибо заранее!

Ответ 1

Согласно исследованию, которое я выполнил, его можно проверить, проверив основные ограничения! Проверьте API для возврата результатов метода getBasicConstraints().

Итак, если метод возвращает результат != -1, сертификат можно рассматривать как CA certificate.

Я проверил это с несколькими CA certificates (корневыми и промежуточными), и он работает, как описано. Я также проверил этот метод с несколькими сертификатами пользователя, и метод возвращает результат -1.

Ответ 2

X509Certificate.getKeyUsage() javadoc:

получает логический массив, представляющий биты расширения KeyUsage, (OID = 2.5.29.15). Расширение использования ключа определяет цель (например, шифрование, подпись, подпись сертификата) ключа, содержащегося в сертификат. Определение ASN.1 для этого:

          KeyUsage ::= BIT STRING {
              digitalSignature        (0),
              nonRepudiation          (1),
              keyEncipherment         (2),
              dataEncipherment        (3),
              keyAgreement            (4),
              keyCertSign             (5),  --> true ONLY for CAs
              cRLSign                 (6),
              encipherOnly            (7),
              decipherOnly            (8) }

Сертификат можно проверить следующим образом:

X509Certificate cert = ...;
boolean[] keyUsage = cert.getKeyUsage();
if ( keyUsage[5] ) {
    // CA certificate
}
else {
    // User certificate
}

Ответ 3

Корневой ЦС будет самоподписанным сертификатом с включенным флагом keyCertSign. В большинстве сценариев общее имя может содержать слово CA для удобства. Промежуточный сертификат CA может быть подписан Root CA (или другим промежуточным звеном!). В вашем хранилище ключей броузера будут приведены примеры общепринятых сертификатов CA.

От Целевая группа Internet Engineering

The keyCertSign bit is asserted when the subject public key is
    used for verifying a signature on certificates.  This bit may only
    be asserted in CA certificates.