Файл компонента не соответствует проверочной информации, указанной в манифесте

Обновлено: 03.07.2024

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

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

Эта тема содержит следующие разделы:

26.1 Атрибут разрешений

Атрибут Permissions используется для проверки того, что уровень разрешений, запрошенный RIA при его запуске, соответствует уровню разрешений, установленному при создании JAR-файла. Этот атрибут требуется в манифесте основного JAR-файла для RIA, вторичные JAR-файлы и расширения не обязаны иметь атрибут Permissions. Если атрибут отсутствует в основном JAR-файле, RIA блокируется.

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

песочница — указывает, что RIA работает в изолированной программной среде безопасности и не требует дополнительных разрешений.

all-permissions — указывает, что для RIA требуется доступ к системным ресурсам пользователя.

Для приложений и апплетов Java Web Start, использующих JNLP, значение атрибута Permissions должно соответствовать уровню разрешений, запрошенному в файле JNLP, или соответствовать разрешению по умолчанию, если уровень разрешений не запрашивается. В противном случае отображается ошибка, и RIA блокируется. См. Структуру файла JNLP для получения информации об элементе безопасности, который используется для запроса уровня разрешений. Если элемент отсутствует, уровень разрешений по умолчанию — песочница .

Для апплетов, не использующих JNLP, значение атрибута разрешений должно соответствовать уровню разрешений, запрошенному в теге апплета. В противном случае отображается ошибка, и RIA блокируется. Если тег апплета не содержит уровня разрешений, то подписанные апплеты запускаются с уровнем разрешений, заданным атрибутом Permissions. Информацию о настройке уровня разрешений в теге апплета см. в разделе Развертывание с помощью тега апплета.

26.2 Атрибут кодовой базы

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

Таблица 26-1 Допустимые значения атрибута Codebase

Значение атрибута Codebase должно соответствовать расположению файла JAR для RIA. В противном случае отображается ошибка, и RIA блокируется. Если атрибут отсутствует, в консоль Java записывается предупреждение и используется база кода, указанная для тега апплета или файла JNLP.

26.3 Атрибут имени приложения

Атрибут Application-Name предоставляет название подписанного RIA. Название RIA используется в запросах безопасности, когда у пользователя запрашивается разрешение на запуск RIA. Значимый заголовок помогает пользователям принять решение доверять RIA и использовать его. Значение может быть любой допустимой строкой, например:

Если RIA имеет неподписанный файл JNLP или запускается с тегом апплета на веб-странице, используйте атрибут Application-Name, чтобы убедиться, что пользователям показывается действительное название из подписанного источника. Если атрибут Application-Name отсутствует в манифесте файла JAR, в консоль Java записывается предупреждение и используется значение атрибута Main-Class. Если в манифесте нет ни одного атрибута, в запросах безопасности заголовок не отображается.

Если RIA имеет подписанный файл JNLP, заголовок, отображаемый в запросах безопасности, берется из элемента заголовка в файле JNLP. Атрибут Application-Name игнорируется.

Названия неподписанных RIA не отображаются.

26.4 Атрибут Application-Library-Allowable-Codebase

Атрибут Application-Library-Allowable-Codebase определяет местоположения, в которых ожидается наличие вашего подписанного RIA. Этот атрибут используется для определения того, что указано в поле «Расположение» для запроса безопасности, который отображается пользователям, когда файл JAR для вашего RIA находится в другом месте, чем файл JNLP или HTML-страница, с которой начинается ваш RIA. Если файлы находятся не в указанных местах, RIA блокируется. Задайте для этого атрибута домены, в которых расположены файл JAR, файл JNLP и HTML-страница. Чтобы указать более одного домена, разделите домены пробелом, например:

Если атрибут Application-Library-Allowable-Codebase присутствует и соответствует местоположению, из которого запускается RIA, то в поле «Местоположение» для подсказки указывается один хост, и предоставляется возможность скрыть будущие подсказки.Если этот атрибут присутствует и доступ к файлам осуществляется из расположения, не включенного в этот атрибут, то RIA блокируется. Если этот атрибут отсутствует, то несколько хостов, соответствующих расположениям файла JAR и файла JNLP или HTML-страницы, перечислены в поле «Местоположение» для подсказки. Когда отображается несколько хостов, пользователь может установить флажок «Больше не показывать» для приложений от издателя и расположения, указанных выше. Рекомендуется использовать этот атрибут, чтобы доступ к файлам для RIA осуществлялся только из известных мест.

Этот атрибут не требуется, если файл JAR для RIA находится в том же месте, что и HTML-страница, с которой начинается RIA. Атрибут необходим, если Java Web Start используется с загруженным файлом JNLP, который не содержит атрибута href, установленного на исходное местоположение файла JNLP. Загруженный файл JNLP без атрибута href рассматривается как локальный файл и поэтому не соответствует расположению файла JAR для RIA.

См. описание допустимых значений атрибута Codebase.

26.5 Атрибут Caller-Allowable-Codebase

Атрибут Caller-Allowable-Codebase используется для определения доменов, из которых код JavaScript может выполнять вызовы вашего RIA без запросов безопасности. Задайте для этого атрибута домен, на котором размещен код JavaScript. Если вызов выполняется из кода JavaScript, который не находится в домене, указанном атрибутом Caller-Allowable-Codebase, вызов блокируется. Чтобы указать более одного домена, разделите домены пробелом, например:

Если атрибут Caller-Allowable-Codebase отсутствует, при вызовах из кода JavaScript в ваш RIA отображается предупреждение системы безопасности, и пользователи могут разрешить или заблокировать вызов. Для неподписанных RIA код JavaScript, требующий доступа к RIA, должен находиться в том же месте, что и основной файл JAR для вашего RIA, в противном случае пользователю будет предложено разрешить доступ. Запросы безопасности отображаются для каждого экземпляра classLoader апплета.

26.6 Атрибут точки входа

Атрибут Entry-Point используется для идентификации классов, которые разрешено использовать в качестве точек входа в ваш RIA. Идентификация точек входа помогает предотвратить запуск несанкционированного кода, когда файл JAR имеет более одного класса с методом main(), несколько классов апплета или несколько классов приложения JavaFX. Задайте для этого атрибута полное имя класса, которое можно использовать в качестве точки входа для RIA. Чтобы указать более одного класса, разделите классы пробелом, например:

Если манифест JAR подписан, а точка входа основного класса или класса апплета, указанная в файле JNLP или дескрипторе приложения, отличается от класса, указанного для атрибута Entry-Point, то RIA блокируется. Если атрибут Entry-Point отсутствует, для запуска вашего RIA можно использовать любой класс с методом main() или любой класс приложения Applet или JavaFX в файле JAR.

26.7 Доверенный атрибут

Атрибут Trusted-Only используется для предотвращения загрузки ненадежных классов или ресурсов для апплета или приложения. Установите для атрибута значение true , например:

Этот атрибут предотвращает перепрофилирование привилегированного приложения или апплета с ненадежными компонентами. Все классы и ресурсы в приложении или апплете должны быть подписаны и запрашивать все разрешения.

26.8 Атрибут доверенной библиотеки

Атрибут Trusted-Library используется для приложений и апплетов, предназначенных для работы с ненадежными компонентами. Диалоговое окно с предупреждением не отображается, и приложение или апплет может загружать файлы JAR, содержащие ненадежные классы или ресурсы. Установите для атрибута значение true , например:

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

В приложении или апплете со смешанным кодом все привилегированные классы и ресурсы должны быть включены в файлы JAR, содержащие атрибут Trusted-Library. Этот атрибут используется для вызовов между привилегированным кодом Java-песочницы и Java-кодом. Если у вас есть код JavaScript, который вызывает код Java, см. раздел Атрибут Caller-Allowable-Codebase.

Все JAR-файлы доверенных библиотек загружаются в отдельный выделенный загрузчик классов, уникальный для приложения или экземпляра апплета. Этот загрузчик Trusted-Library теперь является родительским для обычного загрузчика Web Start или класса апплета. Для обратной совместимости с исходным порядком поиска оба загрузчика совместно реализуют общий путь к классам. Как и в предыдущих выпусках, файлы JAR используют отложенную загрузку и открываются по мере необходимости для поиска запрошенных классов и ресурсов.

Код в файле JAR, который должен быть помечен атрибутом манифеста Trusted-Library, может потребовать незначительного изменения, если он использует вызовы, зависящие от загрузчика классов, например версию с одним параметром Class.forName() , Class .getResource() и Class.getResourceAsStream(), некоторые варианты java.util.ResourceBundle.getBundle() и любые другие методы, которые работают относительно загрузчика, определяющего их непосредственный вызывающий код. Изменения необходимо вносить только в том случае, если запрошенный класс или ресурс может быть найден в файле JAR, который не является доверенной библиотекой (и поэтому загружается обычным загрузчиком классов Web Start или апплета).

Код в Trusted-Library может найти обычный загрузчик, вызвав Thread.currentThread().getContextClassLoader() . Обратите внимание, однако, что бывают необычные обстоятельства, при которых getContextClassLoader() может возвращать значение null . Например, это может произойти, когда сборщик мусора использует системный поток JRE для вызова метода Object.finalize() недостижимого экземпляра.

Если вам нужно преобразовать класс в Class.getResource() или Class.getResourceAsStream() в их эквиваленты ClassLoader, не забудьте настроить строковый параметр, как описано в документации для этих двух методов. Если исходное имя ресурса начиналось с «/», то это было абсолютное имя, и начальный «/» просто необходимо удалить. В противном случае определите, находится ли экземпляр класса, который был целью вызова getResource, в именованном пакете. Если это массив, вы должны сначала определить базовый тип компонента массива. Вызовите Class.getName() для экземпляра типа класса или компонента. Если имя класса содержит какие-либо '.' символов, он находится в именованном пакете, который должен быть добавлен перед исходным именем ресурса. Определите имя пакета, удалив все символы после завершающего '.' и включив его. персонаж. Затем замените все оставшиеся '.' символы с символами '/'. Наконец, добавьте завершающий символ «/» и добавьте исходную строку имени ресурса. Теперь эту новую строку можно передать в версию ClassLoader методов getResource() или getResourceAsStream().

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

26.9 Предотвращение повторного назначения RIA

Атрибут Permissions и атрибут Codebase были введены в выпуске JDK 7u25 для защиты RIA от несанкционированного перепрофилирования кода.

Без атрибута Permissions злоумышленник может использовать пользователя, повторно развернув приложение, подписанное вашим сертификатом, и запустив приложение с другим уровнем привилегий.

26.10 Дополнительная информация

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

Информацию о добавлении атрибутов в файл манифеста JAR см. в разделе Изменение файла манифеста в руководстве по Java.

Читайте также: