Избегайте блокировки уровня безопасности без добавления URL в список сайтов исключений

Я создал Java signed applet, он работает отлично, если я установлю высокий уровень безопасности Java(JRE 8) и добавлю URL своего сайта в список сайтов исключений.

Но если мы не добавим URL-адрес сайта в список сайтов-исключений, исключение безопасности Java будет иметь следующий смысл: добавить URL-адрес в список сайтов-исключений

Я создал подписанный апплет, используя сертификат третьей части.

Вот мой файл манифеста после создания подписанного апплета:

Есть ли какая-либо опция, позволяющая избежать всплывающих окон, блокирующих безопасность, путем добавления некоторых изменений в файл манифеста при создании подписанного апплета или любого сценария, кода Java, чтобы избежать появления этих всплывающих окон без добавления URL-адреса сайта в список сайтов-исключений?

Или это действительно обязательно из Java, что мы должны добавить URL сайта в список сайтов исключений, чтобы избежать такой ошибки блокировки.

В принципе, есть ли возможность добавить наш URL в список сайтов исключений через файл манифеста или любой код Java? Блокирование всплывающего окна происходит, если мы не установили URL в списке исключений

Обязательно ли, если я хочу подписать свой апплет с использованием подписанного сертификата, то это должен быть сертификат подписи кода? подстановочный знак или ssl сертификат не будет работать?

Поскольку я получаю самоподписанную проблему блока апплета, хотя я подписал свой апплет с подстановочным сертификатом.

4 ответа

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

Вы можете предотвратить это всплывающее окно, если вы подписываетесь с использованием сертификата подписи кода, который подписан доверенным центром сертификации. Тогда пользователь получит более приятный диалог подтверждения, в котором будет указано ваше имя как издателя приложения:

См. Также документацию Oracle по диалоговым окнам безопасности для описания диалоговых окон и почему и когда они появляются.

Посмотрите документацию по работе с Подписанными RIA, в частности 23.2 "Подписывание RIA", для получения информации о том, как создать сертификат подписи кода для подписи вашего апплета.

Вторая приятная ссылка - http://www.oracle.com/technetwork/java/javase/tech/java-code-signing-1915323.html

--ОБНОВИТЬ--

Что именно делает сертификат сертификатом подписи кода?

Сертификаты X.509 могут включать в себя поля использования ключа (KU) и расширенные поля использования ключа (EKU). Эти поля, если они присутствуют, ограничивают допустимое использование сертификата. Плагин Java проверяет наличие этих полей.

Я нашел исходный код EndEntityChecker, который выполняет эту проверку.

/**
 * 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);
    }

    [...]

    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. Но если указаны KU, цифровая подпись KU должна быть одной из них. Аналогичным образом, если указаны какие-либо EKU, следует также указать либо подпись кода EKU (обозначенную oid 1.3.6.1.5.5.7.3.3), либо любое использование EKU (обозначенное oid 2.5.29.37.0).

Наконец, checkRemainingExtensions метод останавливается, когда он встречает другие важные критические EKU.

Поэтому я ожидаю, что в вашем подстановочном SSL-сертификате указан хотя бы один EKU, который не является подписью кода и поэтому не распознается как действительный сертификат подписи кода плагином java.

Или действительно из JAVA обязательно нужно добавить URL сайта в список сайтов исключений, чтобы избежать такой ошибки блокировки.

В основном да. Конечные пользователи могут отключить всплывающее окно безопасности, но вы не можете сделать это через приложение. Если вы посмотрите документацию Oracle "Избегание диалогов безопасности". Ясно сказано, что всплывающее окно безопасности является ожидаемым поведением:

Java Runtime автоматически предупредит пользователя о возможных проблемах безопасности. Если вы уверены, что используемые вами приложения безопасны, тогда можно обойти диалоговые окна безопасности, чтобы упростить взаимодействие с пользователем. Если приложение Java / приложение веб-запуска подписано, появится диалоговое окно с предупреждением о безопасности сертификата, и пользователь должен нажать кнопку "Выполнить", чтобы предоставить все разрешения коду приложения.

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

Вот параметры (цитируемые в "Избегание диалогов безопасности"):

  • Пользователь принимает сертификат, используемый для подписи приложения, и устанавливает флажок Всегда доверять контенту от этого издателя. Затем в следующий раз разрешения будут предоставлены этому приложению автоматически (до истечения срока действия сертификата или его удаления из хранилища доверенных ключей).

  • Сертификат можно вручную импортировать в хранилище доверенных сертификатов JRE. Чтобы импортировать сертификат с помощью панели управления Java, выберите вкладку "Безопасность" и выберите "Сертификаты"> "Доверенные сертификаты". Чтобы импортировать сертификат в хранилище сертификатов из командной строки, используйте утилиту keytool (в папке bin JRE).

  • Предоставьте AllPermissions в файле политики Java, расположенном в ${user.home}/. Java.policy, или укажите на любой файл политики Java, который имеет AllPermissions в файле $(JRE_HOME)/lib/security/java.security. Разрешения могут быть предоставлены всем приложениям или ограничены определенным URL. См. Реализация политики по умолчанию и Синтаксис файла политики для более подробной информации о.java.policy.

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

ОБНОВЛЕНИЕ:

Это пример моего файла manisfest:

Manifest-Version: 1.0
Application-Library-Allowable-Codebase: *
Application-Name: myApp
Name: MyName
Permissions: all-permissions
Created-By: 1.7.0_51 (Oracle Corporation)
Caller-Allowable-Codebase: MyServerName
Codebase: * 

Получив кодировщик, эти твики могут показать, что работает:

Manifest-Version: 1.4
Application-Library-Allowable-Codebase: *
Permissions: all-permissions
Caller-Allowable-Codebase: **http://yourIp:yourPort/-**
Codebase: *

Подробности в конце http://yourIp:yourPort/- поставьте "/-" для достижения всего вашего сайта...

Другие вопросы по тегам