Являются ли сертификаты подписи кода Java такими же, как сертификаты SSL?

StackOverflow https://stackoverflow.com/questions/78869

Вопрос

Я ищу Java подписание кода сертификат, чтобы мои Java-апплеты не выдавали такие страшные предупреждения безопасности.Однако во всех местах, которые я нашел, предлагающих им, взимается (на мой взгляд) слишком большая плата, около 200 долларов США в год.При проведении исследования сертификат подписи кода кажется почти таким же, как и сертификат подписи кода. SSL сертификат.

Главный вопрос, который у меня возникает:можно ли купить сертификат SSL, но использовать его для подписи Java-апплетов?

Это было полезно?

Решение

Короткий ответ:Нет, они другие.

Длинный ответ:Это тот же тип сертификата, и он использует то же программное обеспечение для шифрования, но у сертификата есть флаги, указывающие, для чего его разрешено использовать.Подписание кода и веб-сервер используются по-разному.

Другие советы

Когда я импортирую новый сертификат CA в Firefox (и т. д.), у меня есть возможность выбрать, какому сертификату я доверяю:

  • Подписывать серверы
  • Подпишите код (например, ваш апплет)
  • Подписывать сертификаты электронной почты

Итак, для меня ответ:Да, они одинаковые.Кроме того, почему бы не создать свой собственный с помощью OpenSSL (man openssl, man x509, man req и т. д.в Unix)?Вы хотите просто заглушить предупреждения? или Вы хотите другой люди, которых вы никогда не встречали, доверяют вашему коду?Если вам не нужно, чтобы другие пользователи связывали доверие к опорному центру сертификации, связанному с их браузером, ОС и т. д., используйте OpenSSL для создания своего собственного.

И спросите: «Как я могу использовать OpenSSL, чтобы генерировать свои собственные сертификаты?» Если последний - ваш выбор.

Thawte предлагает сертификаты подписи кода здесь.Я полагаю, что другие центры сертификации также предлагают эту услугу.Вы также можете создавать самозаверяющие сертификаты с помощью Ключевой инструмент Java.

Сертификаты X.509 могут включать в себя ключевые поля использования (КУ) и расширенные поля использования ключей (ЭКУ).А Техническая записка Oracle, описывающая, как создать подпись для RIA. создает сертификат без каких-либо флагов использования ключа, который работает нормально (если вы можете заставить доверенный центр сертификации его подписать)

Но все больше и больше центров сертификации выдают сертификаты с этими ключевыми полями использования.Если эти поля присутствуют, ограничивать использование сертификата.Плагин Java проверяет наличие этих полей в КонецEntityChecker:

/**
 * Check whether this certificate can be used for code signing.
 * @throws CertificateException if not.
 */
private void checkCodeSigning(X509Certificate cert)
        throws CertificateException {
    Set<String> exts = getCriticalExtensions(cert);

    if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
        throw new ValidatorException
           ("KeyUsage does not allow digital signatures",
            ValidatorException.T_EE_EXTENSIONS, cert);
    }

    if (checkEKU(cert, exts, OID_EKU_CODE_SIGNING) == false) {
        throw new ValidatorException
            ("Extended key usage does not permit use for code signing",
            ValidatorException.T_EE_EXTENSIONS, cert);
    }

    if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_SSL_CLIENT)) {
        throw new ValidatorException
            ("Netscape cert type does not permit use for SSL client",
            ValidatorException.T_EE_EXTENSIONS, cert);
    }

    // do not check Netscape cert type for JCE code signing checks
    // (some certs were issued with incorrect extensions)
    if (variant.equals(Validator.VAR_JCE_SIGNING) == false) {
        if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_CODE_SIGNING)) {
            throw new ValidatorException
                ("Netscape cert type does not permit use for code signing",
                ValidatorException.T_EE_EXTENSIONS, cert);
        }
        exts.remove(SimpleValidator.OID_NETSCAPE_CERT_TYPE);
    }

    // remove extensions we checked
    exts.remove(SimpleValidator.OID_KEY_USAGE);
    exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE);

    checkRemainingExtensions(exts);
}

Методы проверки выглядят следующим образом:

/**
 * Utility method checking if the extended key usage extension in
 * certificate cert allows use for expectedEKU.
 */
private boolean checkEKU(X509Certificate cert, Set<String> exts,
        String expectedEKU) throws CertificateException {
    List<String> eku = cert.getExtendedKeyUsage();
    if (eku == null) {
        return true;
    }
    return eku.contains(expectedEKU) || eku.contains(OID_EKU_ANY_USAGE);
}

Поэтому, если KU или EKU не указаны, средство проверки KU или EKU с радостью возвращает true.

Но

  • если указаны КУ, то цифровая подпись КУ должен быть одним из них.
  • если указаны какие-либо EKU, либо EKU подписание кода (обозначается oid 1.3.6.1.5.5.7.3.3) или EKU любое использование (идентифицированный oid 2.5.29.37.0) также должен быть указан.

Наконец, checkRemainingExtensions метод проверяет оставшиеся критические EKU.Единственные другие критические EKU, которые могут присутствовать:

  • основные ограничения (oid "2.5.29.19") и
  • альтернативное имя темы (оид 2.5.29.17)

Если он обнаружит какой-либо другой критический EKU, он вернет false.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top